リソースをカプセル化したオブジェクトの使用
更新 : 2007 年 11 月
リソースをカプセル化したオブジェクトを使ったコードを記述する場合は、オブジェクトが不要になった時点で、そのオブジェクトの Dispose メソッドが必ず呼び出されるようにする必要があります。そのオブジェクトの Dispose メソッドが必ず呼び出されるようにするには、C# の using ステートメントを使用するか、共通言語ランタイムを対象とする他の言語で Try/Finally ブロックを実装します。
C# の using ステートメント
C# プログラミング言語の using ステートメントを使うと、オブジェクトを作成したりクリーンアップしたりするために記述する必要のあるコードを簡略化できるので、Dispose メソッドの呼び出しをより自動化できます。using ステートメントは、1 つ以上のリソースを取得し、指定されたステートメントを実行した後、オブジェクトを破棄します。using ステートメントは、オブジェクトを構築しているメソッドより有効期間が短いオブジェクトに対してだけ有用であることに注意してください。「Dispose メソッドの実装」の C# のコード例で示したように、ResourceWrapper クラスのインスタンスを作成およびクリーンアップするコード例を次に示します。
class myApp
{
public static void Main()
{
using (ResourceWrapper r1 = new ResourceWrapper())
{
// Do something with the object.
r1.DoSomething();
}
}
}
using ステートメントが組み込まれた上記のコードは、次のコードと同じ処理を実行します。
class myApp
{
public static void Main()
{
ResourceWrapper r1 = new ResourceWrapper();
try
{
// Do something with the object.
r1.DoSomething();
}
finally
{
// Check for a null resource.
if (r1 != null)
// Call the object's Dispose method.
r1.Dispose();
}
}
}
C# の using ステートメントでは、単一のステートメントで複数のリソースを取得できます。そのようなステートメントは、内部的には複数の using ステートメントを入れ子にした場合と同じです。コード例および詳細については、「using ステートメント (C# リファレンス)」を参照してください。
Try/Finally ブロック
リソースをカプセル化したオブジェクトを使ったマネージ コードを C# 以外の言語で記述する場合は、Try/Finally ブロックを使用して、そのオブジェクトの Dispose メソッドが必ず呼び出されるようにします。「Dispose メソッドの実装」の Visual Basic のコード例で示したように、Resource クラスのインスタンスを作成およびクリーンアップするコード例を次に示します。
class myApp
Public Shared Sub Main()
Resource r1 = new Resource()
Try
' Do something with the object.
r1.DoSomething()
Finally
' Check for a null resource.
If Not (r1 is Nothing) Then
' Call the object's Dispose method.
r1.Dispose()
End If
End Try
End Sub
End Class