using ステートメント (C# リファレンス)
IDisposable オブジェクトの正しい使用を保証する簡易構文を提供します。
使用例
using ステートメントの使用方法を次の例に示します。
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
解説
File および Font は、アンマネージ リソース (この場合はファイル ハンドルとデバイス コンテキスト) にアクセスするマネージ型の例です。 アンマネージ リソースや、それをカプセル化するクラス ライブラリ型は他にもたくさんあります。 そのような型はすべて、IDisposable インターフェイスを実装する必要があります。
一般に、IDisposable オブジェクトを使用するときは、それを using ステートメントで宣言して、インスタンス化する必要があります。 using ステートメントは、オブジェクトで正しく Dispose メソッドを呼び出します。(前述のようにこのステートメントを使用する場合) Dispose が呼び出されるとすぐに、オブジェクト自体がスコープの外側に出されます。 オブジェクトは、using ブロック内では読み取り専用です。変更したり再割り当てしたりすることはできません。
using ステートメントを使うと、オブジェクトでのメソッドの呼び出し中に例外が発生した場合でも Dispose が必ず呼び出されます。 オブジェクトを try ブロックに配置し、finally ブロックで Dispose を呼び出しても、同じ結果が得られます。実際には、コンパイラは using ステートメントをこのように変換します。 前のコード例は、コンパイル時に次のコードに展開されます (オブジェクトのスコープの範囲を定義する中かっこが加えられています)。
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
using ステートメントでは、次の例に示すように、型のインスタンスを複数宣言できます。
using (Font font3 = new Font("Arial", 10.0f),
font4 = new Font("Arial", 10.0f))
{
// Use font3 and font4.
}
リソース オブジェクトをインスタンス化して、変数を using ステートメントに渡すことは可能ですが、これはベスト プラクティスではありません。 この場合、アンマネージ リソースへのアクセスはおそらくできなくなっているのにもかかわらず、制御が using ブロックを離れた後もオブジェクトはスコープ内に残ります。 つまり、完全に初期化されることはありません。 using ブロックの外側でオブジェクトを使おうとすると、例外がスローされる可能性があります。 このため、通常は、オブジェクトを using でインスタンス化して、そのスコープを using ブロックに制限することをお勧めします。
Font font2 = new Font("Arial", 10.0f);
using (font2) // not recommended
{
// use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight();
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。
参照
参照
アンマネージ リソースをクリーンアップするための Finalize および Dispose の実装