使用文の目的は何ですか?
-
24-12-2019 - |
質問
このusing
文はtry/finally
のように機能します。したがって、using
ステートメントで例外が発生した場合は、プログラムをクラッシュしないでください。
しかしながら、以下の例に示すDownloadString
メソッドがWebException
をスローし、プログラムがクラッシュします。
using (WebClient client = new WebClient())
{
string response = client.DownloadString(url);
// ...
}
.
using
ステートメントはtry/catch/finally
のように機能しないため、通常は例外は処理されません。しかし、それでは、using
ステートメントの目的は何の目的はどのくらいだと思います。
アップデート... 以下の応答に基づいて、次の考慮事項を追加します。基本的に、私が例外を処理する必要がある場合、可能な解決策は次のようになる可能性があります。
-
using
ステートメントをtry/catch
ブロック内に置きます。 -
DonwloadString
ブロック内にtry/catch
メソッドだけを置きます。 - 次のコードサンプルのように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();
}
.解決
私が正しく理解した場合、使用文はtry / party
のように機能します。
正しい。
だから私は、使用文に例外が発生した場合、プログラムをクラッシュしないでください。
誤って
try/finally
もusing
ステートメントもスロウの例外を吸い込みません - 例外をキャッチしない場合は、伝播します。それが取り消されていない場合は、通常プロセスを終了します。 (どちらのスレッドに基づいて、CLRがどのように設定されているか、それが異なる問題であるかに基づいて、それがない場合はいくつかのケースがあります。)
しかし、それでは、使用文の目的は何であるか疑問に思います。
リソースを廃棄する必要があるコードを書くことをより簡単にするために。それで全部です。 using
ステートメントを持っていない場合は、try
と呼ばれるfinally
/ Dispose
ブロックの lot があります。 (そこに行ったことがある - Java 7がtry-with-resourcesのステートメントを導入するまでJavaであることがありました。)
他のヒント
using
ステートメントは、すべての例外を魔法のように消えることはできません。これは、管理されていないリソースが解放されていることを確認するために重要です。
発生する例外を再出回り、それでもあなた自身のコードでそれらを処理する必要があります。
短い場合は、例外が発生しても.Dispose()
が呼び出されるようにします。しかしそれはそのことをすることから例外を止めません。
使用文はキャッチを持たず、最後に、したがってあなたのためにリソースを廃棄します。使用文がすべての例外を捉えて実行を続行した場合は、デバッグの大きな障害があります。
使いやすくて早く
自分のために会いましょう
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 / partyのどちらかの例外処理をしないでください