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

本文关键字:什么 抛出异常 IDisposable 接口 实现 | 更新日期: 2023-09-27 18:02:27

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

 myObj = null;

我也想知道如果抛出异常是否仍然调用Dispose方法?或者我应该使用"using"块?

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

我的理解是,当你已经完成使用对象(类似下面的行)的Dispose方法被调用,以确保一切都被清理-这是正确的吗?

不,这是不对的。将对象的实例设置为null而不是调用它的Dispose方法,当你完成一个对象时,你应该显式地这样做。

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

这通常通过使用using

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

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

如果想要释放该对象在特定时刻使用的系统资源,则应该显式调用Dispose。如果我们没有调用Dispose,系统会在某个时候通过Garbage Collector处理这个问题。

如果一个对象实现了System。然后我们就可以对它调用dispose方法。

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

查看此链接以获取所需的所有信息,例如系统如何处理此和所有Using语句

只是从提到的链接复制代码,使其更有用。

如果你有这样的代码

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();
}