实现IDisposable接口以及抛出异常时会发生什么

时间:2015-07-13 10:13:26

标签: c# .net

我有一个实现接口IDisposable的类。我的理解是,当你完成使用对象(如下面的行)之后,调用Dispose方法以确保清理所有内容 - 这是正确的吗?

 myObj = null;

我还想知道是否抛出异常是否仍然调用Dispose方法?或者我应该使用'使用'块?

2 个答案:

答案 0 :(得分:2)

  

我的理解是,当你完成对象的使用时(类似下面这一行),调用Dispose方法以确保清理所有内容 - 这是正确的吗?

不,这不正确。将对象的实例设置为null调用其Dispose方法,您应该在完成对象后明确地执行此操作。

myObj.Dispose();// Im done with myObj!

通常使用using

来完成
using(var myObj = new MyObject())
{
     myObj.DoSomething();
} // Dispose automatically called.

以上确保调用Dispose,即使在using块中抛出异常也是如此。

答案 1 :(得分:1)

如果要在该特定时刻释放此对象使用的系统资源,则应显式调用Dispose。如果我们不调用Dispose,系统将在某些时候使用垃圾收集器来处理这个问题。

如果一个对象实现了System.IDisposable,那么我们就可以在其上调用dispose方法。

使用 将转换为try,最后由CLR阻塞,并在finally块中调用dispose方法释放资源。

选中此链接,查看您需要的所有信息,例如系统如何处理此问题以及所有Using Statement

只需复制上述链接中的代码即可使其更有用。

如果你有这样的代码

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();

}

然后它会自动转换为

MyResource myRes= new MyResource();
try
{
    myRes.DoSomething();
}
finally
{
    // Check for a null resource.
    if (myRes!= null)
        // Call the object's Dispose method.
        ((IDisposable)myRes).Dispose();
}