有人可以解释为什么#1方法比#2更好吗?
1
try
{
}
catch
{
}
finally
{
reader.Close();
dataStream.Close();
response.Close();
}
2
try
{
reader.Close();
dataStream.Close();
response.Close();
}
catch
{
}
如果reader.Close()
引发异常,您的两个选项将永远不会关闭dataStream
或response
.
但是,在您的 #2 选项中,如果之前的代码reader.Close()
引发异常,则不会关闭任何对象。在 #1 中,您至少可以保证您将reader.Close()
始终调用,即使其他事情引发了异常。
不过,一般来说,任何具有Close()
方法的对象也应该实现Close
via IDisposable.Dispose()
,在这种情况下,我总是更喜欢使用using
以下选项中的任何一个来代替:
using(var reader = CreateReader())
{
using(var dataStream = CreateDataStream(reader))
{
using(var response = CreateResponse(dataStream))
{
// Use objects
}
}
}
这将强制所有对象都正确关闭,但更干净。
我更喜欢方法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();
}
如果在所有对象关闭之前,try 块中的任何地方发生异常,它们将不会被关闭。finally 块允许您在 try 块中引发异常时执行清理。
正如其他人所提到的,这种using
方法是我使用自己的代码的方式。编译器会为您翻译using
成try{} finally{}
块。查看以下 MSDN 链接:http: //msdn.microsoft.com/en-us/library/yh598w02.aspx
干杯。
由于 Try 块旨在处理可能的失败,因此处理成功和不成功的案例非常重要。Try 块中的项目可能会被调用,也可能不会 - 取决于是否发生故障以及发生故障的位置。
通过将闭包语句放入 finally 块中,您可以确保语句将始终被调用,无论 Try 部分是否成功。这样,您就不会让阅读器、数据流和响应保持打开状态——即使确实发生了故障。