使用声明的目的是什么?

时间:2014-02-27 23:26:24

标签: c# .net exception using-statement try-finally

根据此web page上的内容,如果我理解正确,using语句就像try/finally一样,所以如果发生异常,我可能会错误地预期在using语句中,它不应该使程序崩溃。

但是,当DownloadString方法(如下例所示)抛出WebException时,程序崩溃。

using (WebClient client = new WebClient())
{
    string response = client.DownloadString(url);
    // ...
}

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

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

  1. using语句放在try/catch块中。
  2. 仅将DonwloadString方法放在try/catch块中。
  3. 手动编写try / catch / finally块,如以下代码示例所示。
  4. 第三种解决方案的示例代码。

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

5 个答案:

答案 0 :(得分:5)

  

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

一样

正确。

  

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

不正确的。

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

  

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

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

答案 1 :(得分:3)

using语句不会使所有异常神奇地消失,只是意味着IDisposable.Dispose方法在client对象上正确调用(如果确实发生了)。这对于确保释放任何非托管资源非常重要。

它将重新抛出任何发生的异常,您仍然需要在自己的代码中处理它们。

答案 2 :(得分:0)

See MSDN description of using statement

简而言之,即使发生异常,使用也可确保调用.Dispose()。然而,它并没有阻止异常做这件事。

答案 3 :(得分:0)

using语句没有catch,只有finally,因此为您处理资源。如果using语句要捕获所有异常并继续运行,那将是调试的一大障碍。

答案 4 :(得分:0)

使用和阅读更简单,更快捷

亲自看看

var myVar = null
try
{
    my = new Object();
    //Do stuff
}
finally
{
    if(myVar != null)
        myVar.Dispose()
}

VS

using(var myVar = new Object())
{
    //Do stuff
}

只是为了确保在该对象上调用 Dispose 使用不进行任何异常处理,因为try / finally不是