null
メソッドを実装するときに大きなオブジェクトを設定する必要がありDispose()
ますか?
6 に答える
クラスに Dispose メソッドがある場合、ベスト プラクティスはそれを呼び出すことです。その背後にある理由は、Dispose が呼び出されたときに実行されるのに対し、オブジェクトを null に設定すると、GC の Finalize キューにエントリが追加されるだけであり、GC がいつ実行されるかを判断できないためです。
マネージド リソース (配列など) のみを使用する型に Dispose メソッドを実装しても、パフォーマンス上の利点はありません。それらはガベージ コレクターによって自動的に回収されるためです。Dispose メソッドは、主に、ネイティブ リソースを使用するマネージ オブジェクトと、.NET Framework に公開されている COM オブジェクトに対して使用します。ネイティブ リソース (FileStream クラスなど) を使用するマネージド オブジェクトは、IDisposable インターフェイスを実装します。
採用されている Dispose を inok する洗練された方法は、「using」構造を使用することです。コンストラクトに慣れていない方のために説明すると、このコンストラクトは、操作中に例外がスローされた場合でも、IDisposable を実装するインスタンスで Dispose() を暗黙的に呼び出す手段を提供します。以下は、using コンストラクトの例です。
using(DisposableClass dc = new DisposableClass())
{
dc.PerformActionOnUmanagedResources();
dc.PerformAnotherActionOnUmanagedResources();
}
前の例では、PerformActionOnUmanagedResources() メソッドで例外がスローされた場合、PerformAnotherActionOnUmanagedResources() メソッドは処理されませんが、using ブロックは dc で Dispose メソッドを暗黙的に呼び出し、管理されていないリソースを確実に実現します。
通常はありません。
ガベージ コレクターはルート化されたオブジェクトを探します。どちらのオブジェクトもルート化されていない場合、循環依存関係はコレクションを妨げません。
注意点があります。オブジェクト A がオブジェクト B への参照を持ち、オブジェクト B が破棄されている場合、その関係をクリーンアップする必要があるかもしれません。そうしないと、リークが発生する可能性があります。これが表面化する最も一般的な場所は、イベント ハンドラーです (A->B からの参照は、A のイベントをサブスクライブしているため、B が制御するものです)。この場合、A がまだルート化されている場合、B は破棄されても収集できません。
dispose メソッドの目的は、基本クラスの dispose メソッドを呼び出して、クラスに関連付けられているすべてのリソースと親のクラスを解放することです。このリンクを読んでください。物事が少し明確になるはずです。
「大きなオブジェクト」とはどういう意味ですか?
ただし、少なくとも IDisposable を実装するすべてのメンバーで Dispose() を呼び出す必要があります。
他の人が指摘しているように必要ではありませんが、良い習慣であり、デバッグに役立ちます。
オブジェクトが使用しているポインターを終了したら、それを null に設定すると、後でそのオブジェクトが再利用されるのを防ぐことができます (null 参照例外が発生します)。
C++ デストラクタでメンバ ポインタを削除した後で、メンバ ポインタを null に設定する場合も、同じロジックが適用されます。実行する必要はありませんが、後でトラブルシューティングに役立ちます。
Disposable メソッドの目的について少し考えてみてください。通常は、ガベージ コレクション中に解放されないリソースを保持しているためです。これは通常、データベース接続やファイル ハンドルのようなものです。したがって、Dispose メソッドが呼び出されると、これらのリソースはすべて解放されます。
ヌルが浮かんでいることは、「ゾンビ」オブジェクトが浮かんでいるよりも有害であると私は主張します。