C#使用Statement和iDisposable

时间:2011-05-23 10:38:36

标签: c# idisposable

我刚刚发现最佳实践指示任何类型实现iDisposable的地方,那么你应该将它包装在using语句中以确保对象被正确处理,即使在发生异常时也是如此。

我的问题是,你怎么能轻易告诉哪些对象实现了iDisposable?或者我应该在using语句中包装我不确定的所有内容,然后依赖编译器在编译时告诉我?

感谢。

8 个答案:

答案 0 :(得分:8)

你可以......

  • 查找是否存在Dispose成员
  • 查看类型的定义(F12)
  • 按照你的建议做,包装使用并查看编译器的内容

虽然,最好的方法是了解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)

如果可以使用“使用”声明并使其有效,通常应该这样做。需要注意的一种情况是创建一个对象并将其作为某个其他对象的属性传递。框架可以采取四种方法:

  1. 拍摄传入的IDisposable的快照。接收对象将负责处理快照; IDisposable的供应商负责处理它,并且可以在拍摄快照后随时进行。
  2. 拍摄传入的IDisposable快照,无需关注它是否已被丢弃。供应商负责处理IDisposable,但可以在任何时候合法地进行 - 甚至在传入之前。控件的“字体”属性似乎就是这样。如果Font对象仅用于设置控件的Font属性,可以在创建字体后立即处理该字体,而不必担心以后清理它。
  3. 接收对象要求传入的对象不是Disposed直到接收对象完成它,接收对象将处理它。
  4. 接收对象要求传入的对象不是Disposed直到接收对象完成它,但发送对象仍然负责处理它。

不幸的是,Microsoft似乎在框架的不同部分使用不同的IDisposable对象方法。有时最好的办法是在设置属性后立即处理对象,并查看当接收对象尝试使用它时是否会导致问题。