微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#使用Statement和iDisposable

如何解决C#使用Statement和iDisposable

| 我刚刚发现,最佳实践指示任何类型的实现idisposable的位置,都应将其包装在using语句中,以确保即使在发生异常的情况下也可以正确处理该对象。 我的问题是,如何才能轻松分辨哪些对象实现了idisposable?还是应该将我不确定的所有内容包装在using语句中,然后在编译时依靠编译器告诉我? 谢谢。     

解决方法

你可以 ... 寻找
Dispose
成员的存在 查看您的类型的定义(F12) 按照您的建议进行操作,包装一个using,然后查看编译器的内容 尽管最好的方法是了解IDisposable的用途,但是很快您将了解执行该接口并应该实现该接口的类型。即外部资源,非托管类型包装器(例如GDI图形对象),有限的资源(数据库连接)     ,IDisposable例如由可访问非托管或昂贵资源(例如文件,数据库连接等)的对象实现。因此,在一定程度上,您可以猜测。对于其他情况,intellisense会告诉您对象上是否有Dispose()方法可用。     ,您如何轻松分辨哪些对象实现了iDisposable? 以编程方式可以使用。
IDisposable disposable = obj as IDisposable;
if(disposable!=null)
{
 //this object implements IDisposable
}
else
{
 //Not implement IDisposable interface
}
    ,如果是标准类,则MSDN文档页面应说明它是否实现IDisposable。第三方库通常也随附文档。否则,如果您使用的是Visual Studio之类的IDE,则可以检查该类(F12键)并查看其实现的接口。     ,如果右键单击并选择“转到声明”,则应该在此处找到对象浏览器,可以使用该类实现的所有接口。 否则,请使用智能感知来检查类是否具有Dispose()方法,在这种情况下,请使用Using。 最后,如果您尝试在不是IDisposable的东西上使用Using,则会出现编译器错误。     ,使用对象资源管理器,您应该能够遍历层次结构以查看要使用的对象的根。 但是,如果您要使用的变量不是2,编译器会警告您:
using (int i = 1)
{
// ...
}
会给你一个错误: 错误1 \'int \':using语句中使用的类型必须隐式转换为\'System.IDisposable \'     ,你也可以这样检查
if (anyobject is IDisposable)
{
    //it implemants IDisposable
}
    ,如果可以使用\“使用\”语句并使它起作用,则通常应该这样做。要注意的一种情况是创建对象并将其作为其他对象的属性传递。框架可以在此处采用四种方法: 为传入的IDisposable拍摄快照。接收对象将处理快照。 IDisposable的供应商负责处理它,并且可以在拍摄快照后的任何时间进行处理。 为传入的IDisposposable拍摄快照,而无需关心是否已将其丢弃。供应商负责处理IDisposable,但可以在任何时候合法地进行处置,甚至在传入IDisposable之前也是如此。控件的“ Font”属性似乎是这种方式。如果Font对象仅用于设置控件的Font属性,则可以在创建字体后立即将其丢弃,而不必担心以后清理它。 接收对象要求不要将传入的对象处理完毕,直到接收对象完成处理,接收对象才将其处理。 接收对象要求传入的对象在完成接收对象之前不被处置,但是发送对象仍负责处置它。 不幸的是,Microsoft似乎在框架的不同部分中使用了不同的方法来处理IDisposable对象。有时最好的办法是在设置属性后立即处置该对象,并查看接收对象尝试使用它时是否引起问题。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。