アプリによって作成されるオブジェクトの大部分では、 .NET ガベージ コレクター を使用してメモリ管理を処理できます。 ただし、アンマネージ リソースを含むオブジェクトを作成する場合は、それらのリソースの使用が完了したら、それらのリソースを明示的に解放 する必要があります 。 アンマネージド リソースの最も一般的な種類は、ファイル、ウィンドウ、ネットワーク接続、データベース接続などのオペレーティング システム リソースをラップするオブジェクトです。 ガベージ コレクターは、アンマネージ リソースをカプセル化するオブジェクトの有効期間を追跡できますが、アンマネージド リソースを解放してクリーンアップする方法はわかりません。
型でアンマネージ リソースを使用する場合は、次の操作を行う必要があります。
dispose パターンを実装します。 これには、アンマネージド リソースの確定的な解放を有効にする IDisposable.Dispose 実装を提供する必要があります。 型のコンシューマーは、オブジェクト (および使用するリソース) が不要になったときに Dispose を呼び出します。 Dispose メソッドは、アンマネージド リソースを直ちに解放します。
あなたのタイプのコンシューマーが Disposeを呼び出すのを忘れた場合は、アンマネージ リソースを解放する方法を用意しておきます。 このようにするには、次の 2 つの方法があります。
アンマネージドリソースをラップするために、安全なハンドルを使用してください。 これが推奨される手法です。 安全なハンドルは、 System.Runtime.InteropServices.SafeHandle 抽象クラスから派生し、堅牢な Finalize メソッドが含まれています。 セーフ ハンドルを使用する場合は、IDisposable インターフェイスを実装し、Dispose実装でセーフ ハンドルのIDisposable.Dispose メソッドを呼び出すだけです。 Dispose メソッドが呼び出されない場合、セーフ ハンドルのファイナライザーはガベージ コレクターによって自動的に呼び出されます。
または、
ファイナライザーを定義します。 型の利用者がIDisposable.Disposeを呼び出してリソースを決定論的に破棄できない場合、ファイナライゼーションによってアンマネージド リソースが非決定論的に解放されることができます。
Warnung
オブジェクトの最終処理は、複雑でエラーが発生しやすい操作になる可能性があります。独自のファイナライザーを提供する代わりに、安全なハンドルを使用することをお勧めします。
そのタイプのコンシューマーは、IDisposable.Dispose 実装を直接呼び出すことで、アンマネージ リソースに使用されるメモリを解放することができます。 Dispose メソッドを適切に実装すると、セーフ ハンドルのFinalize メソッドまたは独自の Object.Finalize メソッドのオーバーライドが、Dispose メソッドが呼び出されない場合にリソースをクリーンアップするためのセーフガードになります。
このセクションでは...
Dispose メソッドの実装では、 アンマネージ リソースを解放するための Dispose パターンを実装する方法について説明します。
IDisposable
を実装するオブジェクトの使用では、型のコンシューマーがそのDispose実装を確実に呼び出す方法について説明します。 これを行うには、C# using
(または Visual Basic Using
) ステートメントを使用することを強くお勧めします。
リファレンス
型/メンバー | 説明 |
---|---|
System.IDisposable | アンマネージ リソースを解放するための Dispose メソッドを定義します。 |
Object.Finalize | アンマネージ リソースが Dispose メソッドによって解放されない場合に、オブジェクトの最終処理を提供します。 |
GC.SuppressFinalize | 終了処理を抑制します。 このメソッドは、ファイナライザーが実行されないように、 Dispose メソッドから通常呼び出されます。 |
.NET