0

このWeb ページに書かれている内容に基づいて、私の理解が正しければ、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 ブロックを手動で記述します。

3 番目のソリューションのサンプル コード。

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

5 に答える 5

5

私の理解が正しければ、using ステートメントは try/finally のように機能します

正しい。

そのため、using ステートメントで例外が発生しても、プログラムがクラッシュすることはないと思います。

正しくない。

どちらのステートメントtry/finallyusing例外を飲み込みません。例外をキャッチしないと、それが伝播します。キャッチされない場合、通常はプロセスが終了します。(どのスレッドにあるか、CLR がどのように構成されているかに基づいて、そうでない場合がいくつかありますが、それは別の問題です。)

しかし、using ステートメントの目的は何なのだろうか。

リソースを破棄する必要があるコードを簡単に記述できるようにするため。それで全部です。usingステートメントがなければ、... を呼び出したばかりの/ブロックがたくさんあることになり、それはかなり見苦しくなります。(そこに行って、それをやった-Java 7がtry-with-resourcesステートメントを導入するまで、それはJavaでした。)tryfinallyDispose

于 2014-02-27T23:28:45.943 に答える
3

usingステートメントによって、すべての例外が魔法のように消えるわけではありません。例外が発生した場合に、オブジェクトに対してメソッドが正しく呼び出されることを意味するだけですIDisposable.Disposeclientこれは、管理されていないリソースが確実に解放されるようにするために重要です。

発生した例外は再スローされますが、独自のコードでそれらを処理する必要があります。

于 2014-02-27T23:28:56.477 に答える
0

using ステートメントには catch がなく、finally のみがあり、リソースを破棄します。using ステートメントがすべての例外をキャッチして実行を継続すると、デバッグの大きな妨げになります。

于 2014-02-27T23:29:22.417 に答える
0

使用と読み取りが簡単で高速です

自分で見て

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

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

Disposeがそのオブジェクトで呼び出されることを確認するだけです。try/finally も例外処理を行わないため、usingは例外処理を行いません。

于 2014-02-27T23:30:25.173 に答える
0

usingステートメントの MSDN の説明を参照してください

.Dispose()つまり、 using を使用すると、例外が発生した場合でも確実に呼び出されます。ただし、例外がその処理を停止するわけではありません。

于 2014-02-27T23:28:38.820 に答える