2015-07-13 92 views
0

我有一个实现接口IDisposable的类。我的理解是,当您完成对象的使用(如下面的行)时,将调用Dispose方法以确保清除所有内容 - 是否正确?实现IDisposable接口和抛出异常时会发生什么

myObj = null; 

我也想知道是否抛出Dispose方法仍然被调用的异常吗?或者我应该只是使用“使用”块?

+1

在它的面前,看来你应该去阅读一些关于'IDisposable'和实施/使用模式。仅仅通过'myObj = null'本身并不直接调用Dispose' - 我想你可能需要稍微更好地理解发生了什么,但Stack Overflow并不是真的成为这样一个问题的地方。 –

+1

仅当您使用'using'语句时Dispose方法被称为“自动” –

+0

回答第二个问题:http://stackoverflow.com/questions/518352/does-dispose-still-get-called-when-exception -is-thrown-of-a-using-stateme –

回答

2

我的理解是,当您完成使用对象(如下面的行)时,会调用Dispose方法以确保清除所有内容 - 是正确的吗?

不,它是不正确的。将对象的一个​​实例设置为null而不是调用它的Dispose方法,您应该在完成对象时明确地执行此操作。

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

这通常通过利用using

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

完成上述确保Dispose被调用时,即使有异常的using块内抛出。

+3

值得一提的是,将实例设置为null没有用处。垃圾收集器会注意到一个对象不再被引用。 [JIT通常足够聪明,可以认识到obj = null可以被优化](http://blogs.msdn.com/b/clyon/archive/2004/12/01/273144.aspx)。 –

+0

即使我们不能明确地调用dispose,那么finalizer也应该出现在GC finalization的图片中 –

1

如果想释放该对象在特定时刻使用的系统资源,应明确调用Dispose。如果我们没有调用Dispose,系统会在垃圾收集器的某个位置处理此问题。

如果一个对象实现了System.IDisposable,那么我们将能够调用它的dispose方法。

使用将被转换的尝试,最后由CLR和Dispose方法块将被称为在finally块来释放资源。

检查这个链接,你需要像系统是如何处理这和所有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(); 
} 
相关问题