问题描述
|
我刚刚发现,最佳实践指示任何类型的实现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对象。有时最好的办法是在设置属性后立即处置该对象,并查看接收对象尝试使用它时是否引起问题。