DUPE: C# での「使用」の使用
私は人々が以下を使用しているのを見てきましたが、その目的は何ですか? ガベージコレクションで使用した後、オブジェクトが破棄されるのですか?
例:
using (Something mySomething = new Something()) {
mySomething.someProp = "Hey";
}
DUPE: C# での「使用」の使用
私は人々が以下を使用しているのを見てきましたが、その目的は何ですか? ガベージコレクションで使用した後、オブジェクトが破棄されるのですか?
例:
using (Something mySomething = new Something()) {
mySomething.someProp = "Hey";
}
を使用すると、大まかに次のように変換されます。
Something mySomething = new Something();
try
{
something.someProp = "Hey";
}
finally
{
if(mySomething != null)
{
mySomething.Dispose();
}
}
そして、それはほとんどそれです。目的は決定論的破棄をサポートすることです。C# はガベージ コレクション言語であるため、C# にはありません。using / Disposal パターンは、型がそのリソースをクリーンアップするタイミングを正確に指定する方法をプログラマーに提供します。
using ステートメントにより、オブジェクトのメソッドを呼び出しているときに例外が発生した場合でも、Dispose() が呼び出されることが保証されます。
using ステートメントには、using ブロックを完了するときに () 内にあるものをすべて破棄するという有益な効果があります。
クラスがIDisposableを実装しているusing
場合に使用できます。ブロック内で例外が発生した場合でも、オブジェクトが正しく破棄されるようにします。Something
using
Dispose
つまり、 を呼び出すためだけに潜在的な例外を手動で処理する必要はありませんusing
。ブロックが自動的に処理します。
これは次と同等です。
Something mySomething = new Something();
try
{
// this is what's inside your using block
}
finally
{
if (mySomething != null)
{
mySomething.Dispose();
}
}
使用するとに変換されます
try
{
...
}
finally
{
myObj.Dispose();
}
コンパイル時(ILの場合)。
したがって、基本的には、 を実装するすべてのオブジェクトで使用する必要がありますIDisposable
。
「using」ブロックは、ブロックを終了するときにオブジェクトの「dispose」メソッドが呼び出されることを保証する方法です。
そのブロックを正常に終了したり、中断したり、戻ったり、例外が発生したりする可能性があるため、便利です。
「try/finally」でも同じことができますが、「using」を使用すると意味が明確になり、ブロック外で変数を宣言する必要がなくなります。