C# の using ステートメントは、try/finally ブロックを使用して、IDisposable を実装するオブジェクトで Dispose を呼び出すための構文上のショートカットを提供します。例えば:
using (FileStream fs = new FileStream ("myFile.txt", FileMode.Open))
{
// ... Write to the file ...
}
コンパイラはこれを次のように変換します。 FileStream fs = new FileStream ("myFile.txt", FileMode.Open);
try
{
// ... Write to the file ...
}
finally
{
if (fs != null) ((IDisposable)fs).Dispose();
}
finally ブロックは、例外がスローされた場合や、コードがブロックを早期に終了した場合でも、Dispose メソッドが呼び出されるようにします。
したがって、単一のブロックを使用すると、単一の使い捨てオブジェクトが破棄されることが保証されます。一方、ネストされた using ステートメントを使用できます。お気に入り
using (myDisposable d = new myDisposable())
{
using(Disposable2 d2 = new Disposable2())
{
// do something and dispose...
}
}
これは次のように変換されます
try
{
// work around for myDisposable
try
{
// work around for Disposable2
}
finally
{
if (d2 != null)
((IDisposable)d2 ).Dispose();
}
}
finally
{
if (d!= null)
((IDisposable)d).Dispose();
}