web-dev-qa-db-ja.com

C#のベストプラクティスで辞書を破棄する

セッションクラスにConcurrentDictionaryがあります。
Keyは、マネージャークラスを表すインターフェイスです。
Valueは、このセッションでそのマネージャーに使用されるDataContractsクラスのリストです。

セッションクラスを破棄するときに、このディクショナリをクリアしたいと思います。すべての値とキーをクリアする必要がありますが、キーを破棄できません-クラスの破棄後もまだ存在しているためです。

これで十分ですか? -これにより、GCが作業を実行しますか?

_myDictionary = null;

または、すべてのキーでforeachを繰り返し処理し、削除を使用して値をクリアする必要があります。

11
ilansch

セッションクラスを破棄するときに、このディクショナリをクリアしたいと思います。

どうして?セッションインスタンスがガベージコレクションの対象になり、セッションがディクショナリを参照する唯一のオブジェクトである場合、ディクショナリはガベージコレクションの対象になります。

これで十分ですか? -これにより、GCが作業を実行しますか?

ほぼ間違いなく不要です。他に辞書への参照がある場合は、that変数をnullに設定しても効果はありません。ディクショナリへの参照が他になく、セッションがガベージコレクションの対象になる場合は、これを行う必要はまったくありません。

ガベージコレクションのために変数をnullに設定する価値があるのは、その変数自体が存続するときだけです(たとえば、オブジェクト内のインスタンス変数であり、notガベージコレクションされるか、静的変数です)。

ちなみに、ガベージコレクションはオブジェクトの「廃棄」とは完全に別であることに注意してください。 DisposeIDisposableは一般的に管理されていないリソースに関係しており、その概念がここに関連していることをあなたの質問に示すものはありません。

19
Jon Skeet