using ステートメント (C# リファレンス)using Statement (C# Reference)

IDisposable オブジェクトの正しい使用を保証する簡易構文を提供します。Provides a convenient syntax that ensures the correct use of IDisposable objects.

Example

using ステートメントを使用する方法の例を次に示します。The following example shows how to use the using statement.

using (Font font1 = new Font("Arial", 10.0f)) 
{
    byte charset = font1.GdiCharSet;
}

コメントRemarks

FileFont は、アンマネージド リソース (この場合はファイル ハンドルとデバイス コンテキスト) にアクセスするマネージド型の例です。File and Font are examples of managed types that access unmanaged resources (in this case file handles and device contexts). アンマネージ リソースや、それをカプセル化するクラス ライブラリ型は他にもたくさんあります。There are many other kinds of unmanaged resources and class library types that encapsulate them. このような型はすべて、IDisposable インターフェイスを実装する必要があります。All such types must implement the IDisposable interface.

IDisposable オブジェクトの有効期間が 1 つのメソッドに限定されているとき、それを using ステートメントで宣言し、インスタンス化してください。When the lifetime of an IDisposable object is limited to a single method, you should declare and instantiate it in the using statement. using ステートメントは、オブジェクトで正しく Dispose メソッドを呼び出します。(前述のようにこのステートメントを使用する場合) Dispose が呼び出されるとすぐに、オブジェクト自体がスコープの外側に出されます。The using statement calls the Dispose method on the object in the correct way, and (when you use it as shown earlier) it also causes the object itself to go out of scope as soon as Dispose is called. オブジェクトは、using ブロック内では読み取り専用です。変更したり再割り当てしたりすることはできません。Within the using block, the object is read-only and cannot be modified or reassigned.

using ステートメントにより、using ブロックで例外が発生した場合でも必ず Dispose が呼び出されます。The using statement ensures that Dispose is called even if an exception occurs within the using block. オブジェクトを try ブロックに配置し、finally ブロックで Dispose を呼び出しても、同じ結果が得られます。実際には、コンパイラは using ステートメントをこのように変換します。You can achieve the same result by putting the object inside a try block and then calling Dispose in a finally block; in fact, this is how the using statement is translated by the compiler. 前のコード例は、コンパイル時に次のコードに展開されます (オブジェクトのスコープ制限を定義する中かっこが加えられていることに注意してください)。The code example earlier expands to the following code at compile time (note the extra curly braces to create the limited scope for the object):

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

try-finally ステートメントの詳細については、「try-finally」のトピックを参照してください。For more information about the try-finally statement, see the try-finally topic.

次の例のように、using ステートメントでは型の複数のインスタンスを宣言できます。Multiple instances of a type can be declared in the using statement, as shown in the following example:

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

リソース オブジェクトをインスタンス化してから、変数を using ステートメントに渡すことはできますが、これはベスト プラクティスではありません。You can instantiate the resource object and then pass the variable to the using statement, but this is not a best practice. この場合、アンマネージド リソースへのアクセスがなくなっている可能性が高いのにもかかわらず、制御が using ブロックを離れた後もオブジェクトはスコープ内に残ります。In this case, after control leaves the using block, the object remains in scope but probably has no access to its unmanaged resources. つまり、完全に初期化されることはなくなります。In other words, it's not fully initialized anymore. using ブロックの外側でオブジェクトを使用しようとすると、例外がスローされる可能性があります。If you try to use the object outside the using block, you risk causing an exception to be thrown. このため、通常は、オブジェクトを using ステートメントでインスタンス化して、そのスコープを using ブロックに制限することをお勧めします。For this reason, it's generally better to instantiate the object in the using statement and limit its scope to the using block.

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(); 

IDisposable オブジェクトの破棄に関する詳細については、「IDisposable を実装するオブジェクトの使用」を参照してください。For more information about disposing of IDisposable objects, see Using objects that implement IDisposable.

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

参照See Also