我有一个实现接口IDisposable的类。我的理解是,当您完成对象的使用(如下面的行)时,将调用Dispose方法以确保清除所有内容 - 是否正确?实现IDisposable接口和抛出异常时会发生什么
myObj = null;
我也想知道是否抛出Dispose方法仍然被调用的异常吗?或者我应该只是使用“使用”块?
我有一个实现接口IDisposable的类。我的理解是,当您完成对象的使用(如下面的行)时,将调用Dispose方法以确保清除所有内容 - 是否正确?实现IDisposable接口和抛出异常时会发生什么
myObj = null;
我也想知道是否抛出Dispose方法仍然被调用的异常吗?或者我应该只是使用“使用”块?
我的理解是,当您完成使用对象(如下面的行)时,会调用Dispose方法以确保清除所有内容 - 是正确的吗?
不,它是不正确的。将对象的一个实例设置为null
将而不是调用它的Dispose
方法,您应该在完成对象时明确地执行此操作。
myObj.Dispose();// Im done with myObj!
这通常通过利用using
using(var myObj = new MyObject())
{
myObj.DoSomething();
} // Dispose automatically called.
完成上述确保Dispose
被调用时,即使有异常的using
块内抛出。
值得一提的是,将实例设置为null没有用处。垃圾收集器会注意到一个对象不再被引用。 [JIT通常足够聪明,可以认识到obj = null可以被优化](http://blogs.msdn.com/b/clyon/archive/2004/12/01/273144.aspx)。 –
即使我们不能明确地调用dispose,那么finalizer也应该出现在GC finalization的图片中 –
如果想释放该对象在特定时刻使用的系统资源,应明确调用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();
}
在它的面前,看来你应该去阅读一些关于'IDisposable'和实施/使用模式。仅仅通过'myObj = null'本身并不直接调用Dispose' - 我想你可能需要稍微更好地理解发生了什么,但Stack Overflow并不是真的成为这样一个问题的地方。 –
仅当您使用'using'语句时Dispose方法被称为“自动” –
回答第二个问题:http://stackoverflow.com/questions/518352/does-dispose-still-get-called-when-exception -is-thrown-of-a-using-stateme –