我刚刚发现最佳实践指示任何类型实现iDisposable的地方,那么你应该将它包装在using语句中以确保对象被正确处理,即使在发生异常时也是如此。
我的问题是,你怎么能轻易告诉哪些对象实现了iDisposable?或者我应该在using语句中包装我不确定的所有内容,然后依赖编译器在编译时告诉我?
感谢。
答案 0 :(得分:8)
你可以......
Dispose
成员虽然,最好的方法是了解IDisposable的用途,很快你就会明白那些做和应该实现这个接口的类型。即外部资源,非托管类型包装器(例如GDI图形对象),有限资源(数据库连接)
答案 1 :(得分:1)
如何轻松判断哪些对象实现了iDisposable?
以编程方式可以使用。
IDisposable disposable = obj as IDisposable;
if(disposable!=null)
{
//this object implements IDisposable
}
else
{
//Not implement IDisposable interface
}
答案 2 :(得分:1)
IDisposable例如由允许访问非托管或昂贵资源的对象实现,例如文件,数据库连接和类似的东西。所以在某种程度上,你可以猜到。对于其余部分,intellisense会告诉您对象上是否有Dispose()方法。
答案 3 :(得分:0)
如果它是标准类,那么MSDN文档页面应该说明它是否实现了IDisposable。第三方库通常也附带文档。否则,如果您使用的是像Visual Studio这样的IDE,则可以检查类(F12键)并查看它实现的接口。
答案 4 :(得分:0)
如果右键单击并选择转到声明,您应该在那里获得对象浏览器,您可以查看该类实现的所有接口。
否则使用intellisense检查类是否具有Dispose()方法,在这种情况下使用Using。
最后,如果您尝试在不是IDisposable的东西上使用Use,则会出现编译错误。
答案 5 :(得分:0)
使用对象资源管理器,您应该能够遍历层次结构以查看您尝试使用的对象的根。
但是,编译器会警告您,如果您尝试使用的变量不是IDisposable
:
using (int i = 1)
{
// ...
}
会给你一个错误:
错误1'int':using语句中使用的类型必须可以隐式转换为'System.IDisposable'
答案 6 :(得分:0)
你也可以这样检查
if (anyobject is IDisposable)
{
//it implemants IDisposable
}
答案 7 :(得分:0)
如果可以使用“使用”声明并使其有效,通常应该这样做。需要注意的一种情况是创建一个对象并将其作为某个其他对象的属性传递。框架可以采取四种方法:
不幸的是,Microsoft似乎在框架的不同部分使用不同的IDisposable对象方法。有时最好的办法是在设置属性后立即处理对象,并查看当接收对象尝试使用它时是否会导致问题。