0

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

1

try
{

}
catch
{
}
finally
{
reader.Close();  
dataStream.Close();
response.Close();
}

2

try
{

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

}
catch
{
}
4

4 回答 4

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
    }
  }
}

这将强制所有对象都正确关闭,但更干净。

于 2013-06-24T16:39:32.300 回答
4

我更喜欢方法3

using(var reader = ...)
using(var dataStream = ...)
using(var response = ...)
{
    //...
}//all disposed (and implicitly closed) at the end of this scope

使用此构造,编译器大致转换为:

var reader = ...;
var dataStream = ...;
var response = ...;
try
{
    //...
    //even if an error happens here
}
finally
{
   //this code still runs before control leaves this method.
   reader.Close();  
   dataStream.Close();
   response.Close();
}
于 2013-06-24T16:41:07.517 回答
0

如果在所有对象关闭之前,try 块中的任何地方发生异常,它们将不会被关闭。finally 块允许您在 try 块中引发异常时执行清理。

正如其他人所提到的,这种using方法是我使用自己的代码的方式。编译器会为您翻译usingtry{} finally{}块。查看以下 MSDN 链接:http: //msdn.microsoft.com/en-us/library/yh598w02.aspx

干杯。

于 2013-06-24T16:41:13.163 回答
0

由于 Try 块旨在处理可能的失败,因此处理成功和不成功的案例非常重要。Try 块中的项目可能会被调用,也可能不会 - 取决于是否发生故障以及发生故障的位置。

通过将闭包语句放入 finally 块中,您可以确保语句将始终被调用,无论 Try 部分是否成功。这样,您就不会让阅读器、数据流和响应保持打开状态——即使确实发生了故障。

于 2013-06-24T16:43:22.440 回答