使用声明的目的是什么?

enz*_*m83 0 .net c# exception using-statement try-finally

根据本网页上的内容,如果我理解正确,该using语句就像a一样try/finally,所以我可能错误地认为如果在using语句中发生异常,它不应该使程序崩溃.

但是,当DownloadString下面的示例中显示的方法抛出a时WebException,程序崩溃.

using (WebClient client = new WebClient())
{
    string response = client.DownloadString(url);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这是正常的,因为using语句不像a那样工作try/catch/finally,实际上没有处理异常.但后来我想知道这个using声明的目的是什么.

更新...根据以下回复,我添加了以下注意事项.基本上,如果我需要处理异常,可能的解决方案可能如下.

  1. using语句放在一个try/catch块中.
  2. 只将DonwloadString方法放在try/catch块中.
  3. 手动编写try/catch/finally块,如下面的代码示例所示.

第三种解决方案的示例代码.

WebClient client = new WebClient();
try
{
    string response = client.DownloadString(url);
    // ...
}
catch(Exception ex)
{
    // handle (or ignore) the exception
}
finally
{
    if (client != null)
        client.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

如果我理解正确,using语句就像try/finally一样

正确.

所以我希望如果在using语句中发生异常,它不应该使程序崩溃.

不正确.

try/finallynor using语句都没有吞下异常 - 如果你没有捕获异常,它将会传播.如果它没有被捕获,它通常会终止该过程.(在某些情况下它不会,根据它所在的线程和CLR的配置方式,但这是另一回事.)

但后来我想知道使用声明的目的是什么.

使编写需要处理资源的代码变得更加简单.就这样.如果我们没有using声明,我们就会有一个很大try/ finally刚刚称为块Dispose......这将是相当丑陋.(去过那里,完成了 - 直到Java 7引入了try-with-resources语句,这就是Java.)

  • @ enzom83:两者都很好 - 无论你觉得哪个更容易阅读.我个人更喜欢在`try` /`catch`里面或外面使用`using`语句; `using`部分让我很容易看到我正在处理资源,而不必检查`finally`块的内容. (3认同)