文字列を取るハッシュテーブルがあります。それらを処分する最良の方法は何ですか?ハッシュ テーブルを使用した後、 clear を呼び出してから、オブジェクトを null に設定する必要がありますか? それとも、ハッシュ テーブル オブジェクトを null に設定するだけで十分でしょうか?
3 に答える
変数を null に設定しても、ガベージ コレクションが行われるとは限りません。他の変数が同じオブジェクトを参照する場合、問題のオブジェクトは参照カウントがゼロになるまで収集されません。
オブジェクトが範囲外になった後にオブジェクトが収集される可能性が高くなるため、オブジェクトの範囲を制限すると役立ちます。idisposable を実装することは、ファイル ハンドルのようなガベージ コレクションによって処理されないアイテムに対してより理にかなっています。
何もしないことを提案する人もいますが、それはほとんど真実です。用語の古典的な C# の意味では、それを破棄することはできず、null に設定することも不要であることがわかります。許可すれば、ガベージ コレクターはその仕事をします。
だからそれをさせてください。
ガベージ コレクターにその仕事を任せるために私が提供しなければならないアドバイスは、オブジェクトの有効期間を必要以上に長くしないように制限することです。オブジェクトがメソッド呼び出しのためにのみ存在する必要がある場合は、変数のスコープと基になるオブジェクトの有効期間をそのメソッドに制限し、より長く存在する可能性のあるクラス メンバーにそれをホイストしないでください。クラスが恣意的に長い間固執する場合、その加盟国はそれと一緒に生きます。
変数を宣言し、必要な場所でオブジェクトをインスタンス化し、必要な場所でのみインスタンス化します。ガベージ コレクターは、処理が終わった後、ある時点でそのメモリを回収することを信頼します。
HashTable
実装されていないIDisposable
ため、それを呼び出すことはできませんDispose
。オブジェクトnull
を割り当てて、ガベージ コレクターに処理させることができます。ガベージ コレクターによって収集される時期を予測することはできませんが、ガベージ コレクターを強制することはできますがGC.Collect
、推奨されません。
あなたが見るかもしれません:ガベージコレクションの基礎
これとは別に、Dictionary<TKey, TValue> Class
の一般的な実装がどれであるかを調べることができますHashTable
。