为什么我们必须关闭finally {}块下的对象?

Dev*_*per 0 .net c# try-catch

有人可以解释为什么#1方法比#2更好?

1

try
{

}
catch
{
}
finally
{
reader.Close();  
dataStream.Close();
response.Close();
}
Run Code Online (Sandbox Code Playgroud)

2

try
{

reader.Close();  
dataStream.Close();
response.Close();

}
catch
{
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 7

如果reader.Close()引发异常,您的两个选项将永远不会关闭dataStreamresponse.

但是,在#2选项中,如果代码在reader.Close()引发异常之前,则不会关闭任何对象.在#1中,你至少保证你reader.Close()总是会打电话,即使其他事情引发了异常.

但是,一般情况下,任何带Close()方法的对象也应该实现Closevia IDisposable.Dispose(),在这种情况下我总是喜欢使用using而不是以下任何一个选项:

using(var reader = CreateReader())
{
  using(var dataStream = CreateDataStream(reader))
  {
    using(var response = CreateResponse(dataStream))
    {
       // Use objects
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这将强制所有对象都正确关闭,但更清晰.