实现IDisposable接口以及抛出异常时会发生什么
本文关键字:什么 抛出异常 IDisposable 接口 实现 | 更新日期: 2023-09-27 18:02:27
我有一个实现接口IDisposable的类。我的理解是,当您完成使用对象(类似于下面的行)时,调用Dispose方法以确保清除所有内容-这是正确的吗?
myObj = null;
我也想知道如果抛出异常是否仍然调用Dispose方法?或者我应该使用"using"块?
我的理解是,当你已经完成使用对象(类似下面的行)的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();
}