【问题标题】:What is the purpose of the using statement?using 语句的目的是什么?
【发布时间】:2014-02-27 23:26:23
【问题描述】:

根据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 块,如以下代码示例所示。

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

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

【问题讨论】:

  • 它会为你调用 Dispose 方法。
  • using 可能不像 try/catch/finally 但它确实像 try/finally{dispose()}
  • using 语句确保 Dispose 被调用,即使您在对象上调用方法时发生异常。

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


【解决方案1】:

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

正确。

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

不正确。

try/finallyusing 语句都不会吞下异常——如果你没有捕捉到异常,它就会向上传播。如果它未被捕获,它通常会终止该过程。 (根据它所在的线程以及 CLR 的配置方式,在某些情况下它不会,但这是另一回事。)

但是我想知道 using 语句的目的是什么。

为了更简单地编写需要处理资源的代码。就这样。如果我们没有 using 语句,我们将有 很多try/finally 块,这些块只是称为 Dispose...,这将是相当丑陋的。 (去过那里,做到了——在 Java 7 引入 try-with-resources 语句之前,这就是 Java。)

【讨论】:

  • 那么,我应该将using 块放在try/catch 块中,或者写一个try/catch/finally{dispose()} 块...这两种解决方案中的哪一种更适合?
  • @enzom83:任何一个都可以——无论你觉得哪个更容易阅读。我个人更喜欢在try/catch 内部或外部使用using 语句; using 部分可以很容易地看到我正在处理资源,而无需检查 finally 块的内容。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    See MSDN description of using statement

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        自己看

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

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

        它只是为了确保在该对象上调用 Disposeusing 不做任何异常处理,因为 try/finally 也不做

        【讨论】:

          猜你喜欢
          • 2014-07-22
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 2014-09-09
          • 2016-03-31
          • 1970-01-01
          • 1970-01-01
          • 2022-01-13
          相关资源
          最近更新 更多