私は、キーが特定のメッセージタイプであり、値がマルチキャストデリゲート、つまりメッセージハンドラであるマルチキャストデリゲートの辞書を持っています。マルチキャストデリゲートの辞書を完全にクリアする
ディクショナリをクリアしたいときは、すべてのデリゲートがバインドされて参照解除され、最終的にガーベジコレクションされていることを確認したい - ディクショナリをクリアするだけで十分ですか、辞書をクリアする前に最初にヌル?
私は、キーが特定のメッセージタイプであり、値がマルチキャストデリゲート、つまりメッセージハンドラであるマルチキャストデリゲートの辞書を持っています。マルチキャストデリゲートの辞書を完全にクリアする
ディクショナリをクリアしたいときは、すべてのデリゲートがバインドされて参照解除され、最終的にガーベジコレクションされていることを確認したい - ディクショナリをクリアするだけで十分ですか、辞書をクリアする前に最初にヌル?
nullに設定するだけです。
foreach (var d in dict)
{
d = null;
}
コンパイラでこれらの参照がなくなると、garbaceがそれを収集します。
最終的には、単にnullに全体の辞書を作る:C#で
dict = null;
ガベージコレクションが問題ではありません。
foreachコードは効果がなく、foreachループ内でdの値を変更することはできません。 dict = nullを設定すると、GCに適格になります(他のどこからでも到達できないと仮定して)。しかし、私は最終的なGCのあなたの権利がそれ自身を世話するべきだと思います。 – Sprotty
カウンタの例がない場合(この場合、MSでバグレポートを開く必要があります)、.NETのガベージコレクションは問題にならないはずです。それはかなり洗練されており、実行中のイメージから参照されない任意の大きなオブジェクトグラフの一部であっても、コードで参照されていないオブジェクトを追跡できます。
でも、辞書を消去してすべての値をnullに設定することに違いはありません。両方とも、基礎となる値を単純に参照解除するのと同じ効果があります。これは過剰です。
.NETの本当の懸念は参照安全性ではなく、リソースリークです。すべてのIDisposableクラスは逆参照する前に破棄する必要があります。しかし、MulticastDelegate
は使い捨てクラスではないので、これは疑問です。
つまり、これは.NETであり、Cではなく、Stress lessです。心配ない。
System.Delegate(およびSystem.MulticastDelegate)クラスは、ほかのクラスとまったく同じ方法で処理されます。これらのクラスは、関数とターゲットオブジェクトへのポインタを含むことになります。ですから、すべての目的と目的に対して、それをターゲットオブジェクトへの参照として扱うことができます。
辞書をクリアするだけで完了した場合は、そのオブジェクトを使って処理しても、実際にそれを行う必要はありません。それらを個別にヌルに設定すると、辞書をクリアすることはできません。
オブジェクトに到達できなくなったらガベージコレクションの対象となります。ガベージコレクションの仕組みに精通していない場合は、対象を少しずつ読むことを強くお勧めします。
疑問がある場合は、より安全なオプションを選択してください。 – Abion47
これは、すべてのデリゲートを列挙し、ヌルに設定することを意味します。 –