アンマネージ リソースのクリーンアップCleaning Up Unmanaged Resources

アプリケーションで作成するオブジェクトの大部分については、.NET のガベージ コレクターにメモリ管理を任せることができます。For the majority of the objects that your app creates, you can rely on .NET's garbage collector to handle memory management. しかし、アンマネージ リソースを含むオブジェクトを作成する場合は、アプリケーションでそのオブジェクトの使用が終了した時点で、そのリソースを明示的に解放する必要があります。However, when you create objects that include unmanaged resources, you must explicitly release those resources when you finish using them in your app. アンマネージ リソースの種類で最も一般的なのは、ファイル、ウィンドウ、ネットワーク接続、データベース接続などのオペレーティング システム リソースをラップしたオブジェクトです。The most common types of unmanaged resource are objects that wrap operating system resources, such as files, windows, network connections, or database connections. ガベージ コレクターは、アンマネージ リソースをカプセル化したオブジェクトを有効期間全体にわたって監視できますが、アンマネージ リソースを解放しクリーンアップする方法については情報を持っていません。Although the garbage collector is able to track the lifetime of an object that encapsulates an unmanaged resource, it doesn't know how to release and clean up the unmanaged resource.

型でアンマネージ リソースを使用している場合は、次のようにする必要があります。If your types use unmanaged resources, you should do the following:

  • dispose パターンを実装します。Implement the dispose pattern. これは、アンマネージ リソースの確定的解放を有効にするために IDisposable.Dispose の実装を提供する必要があります。This requires that you provide an IDisposable.Dispose implementation to enable the deterministic release of unmanaged resources. 型のコンシューマーはオブジェクト (および使用するリソース) が不要になると Dispose を呼び出します。A consumer of your type calls Dispose when the object (and the resources it uses) is no longer needed. Dispose メソッドはアンマネージ リソースを直ちに解放します。The Dispose method immediately releases the unmanaged resources.

  • 型のコンシューマーが Dispose の呼び出しを忘れた場合にアンマネージ リソースを解放します。Provide for your unmanaged resources to be released in the event that a consumer of your type forgets to call Dispose. これには、2 つの方法があります。There are two ways to do this:

    • アンマネージ リソースをラップするセーフ ハンドルを使用します。Use a safe handle to wrap your unmanaged resource. この手法を使用することをお勧めします。This is the recommended technique. セーフ ハンドルは System.Runtime.InteropServices.SafeHandle クラスから派生し、堅牢な Finalize メソッドを含みます。Safe handles are derived from the System.Runtime.InteropServices.SafeHandle class and include a robust Finalize method. セーフ ハンドルを使用するときは、単純に IDisposable インターフェイスを実装し、Dispose の実装でセーフ ハンドルの IDisposable.Dispose メソッドを呼び出します。When you use a safe handle, you simply implement the IDisposable interface and call your safe handle's Dispose method in your IDisposable.Dispose implementation. セーフ ハンドルのファイナライザーは、Dispose メソッドが呼び出されなかった場合、ガベージ コレクターによって自動的に呼び出されます。The safe handle's finalizer is called automatically by the garbage collector if its Dispose method is not called.

      または—or—

    • Object.Finalize メソッドをオーバーライドします。Override the Object.Finalize method. 終了処理では、型のコンシューマーが IDisposable.Dispose を呼び出してアンマネージ リソースを確定的に破棄しなかった場合に、リソースを非確定的に解放できます。Finalization enables the non-deterministic release of unmanaged resources when the consumer of a type fails to call IDisposable.Dispose to dispose of them deterministically. ただし、オブジェクトの終了処理は複雑でエラーが発生しやすい操作であるため、独自のファイナライザーを用意する代わりに、セーフ ハンドルを使用することをお勧めします。However, because object finalization can be a complex and error-prone operation, we recommend that you use a safe handle instead of providing your own finalizer.

これで型のコンシューマーは、IDisposable.Dispose の実装を直接呼び出して、アンマネージ リソースで使用されるメモリを解放することができます。Consumers of your type can then call your IDisposable.Dispose implementation directly to free memory used by unmanaged resources. Dispose メソッドを適切に実装すると、セーフ ハンドルの Finalize メソッドまたは Object.Finalize メソッドの独自のオーバーライドは、Dispose メソッドが呼び出されなかった場合にリソースをクリーンアップするための安全装置になります。When you properly implement a Dispose method, either your safe handle's Finalize method or your own override of the Object.Finalize method becomes a safeguard to clean up resources in the event that the Dispose method is not called.

このセクションの内容In This Section

Dispose メソッドの実装Implementing a Dispose Method
アンマネージ リソースを解放する Dispose パターンを実装する方法について説明します。Describes how to implement the dispose pattern for releasing unmanaged resources.

IDisposable を実装するオブジェクトの使用Using Objects That Implement IDisposable
型のコンシューマーが Dispose の実装を確実に呼び出す方法について説明します。Describes how consumers of a type ensure that its Dispose implementation is called. このためには、C# の using ステートメントまたは Visual Basic の Using ステートメントを使用することをお勧めします。We recommend using the C# using statement or the Visual Basic Using statement to do this.

関連項目Reference

System.IDisposable
アンマネージ リソースの解放のための Dispose メソッドを定義します。Defines the Dispose method for releasing unmanaged resources.

Object.Finalize
アンマネージ リソースが Dispose メソッドによって解放されない場合に、オブジェクトの終了処理を提供します。Provides for object finalization if unmanaged resources are not released by the Dispose method.

GC.SuppressFinalize
終了処理を抑制します。Suppresses finalization. このメソッドは、慣例的に Dispose メソッドから呼び出され、ファイナライザーが実行されないようにします。This method is customarily called from a Dispose method to prevent a finalizer from executing.