调用Dispose()vs对象超出范围/方法完成

csh*_*dev 14 c# idisposable using using-statement

我有一个方法,里面有一个try/catch/finaly块.在try块中,我声明SqlDataReader如下:

SqlDataReader aReader = null;          
aReader = aCommand.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)

finally块中,手动处理的对象是在类级别设置的对象.因此,在该方法的对象,其实现IDisposable,如SqlDataReader上述,他们得到自动处理的?Close()aReader执行while循环后调用,以获取阅读器的内容(应该是Dispose()调用的内容Close()).如果没有调用Close(),当方法完成或对象超出范围时,是否会自动关闭/处置此对象?

编辑:我知道这个using声明,但有些情况令我感到困惑.

Luk*_*keH 26

不,对象在超出范围时不会自动处理.

如果/当它们被垃圾收集时,它们甚至不能保证被处置,尽管许多IDisposable物体实施"后备"终结器以帮助确保它们最终被处置.

您有IDisposable责任确保处理任何物体,最好将它们包裹在一个using块中.


the*_*oop 8

您应该使用一个using {...}块来包装您的IDisposable对象 - 当using块结束时,将调用该Dispose()方法(SqlDataReader传递给该Close()方法).如果你不使用using,当对象超出范围时,对象将不会被自动处理 - 如果有对象终结器,它将取决于垃圾收集时的资源.

using (SqlDataReader aReader = aCommand.ExecuteReader())
{
    // ... do stuff
}   // aReader.Dispose() called here
Run Code Online (Sandbox Code Playgroud)