4

例えば:

Queue<System.Drawing.SolidBrush> brushQ = new Queue<System.Drawing.SolidBrush>();
...
brushQ.Clear();

各アイテムを明示的にデキューして個別に破棄しない場合、Clear() を呼び出したときに残りのアイテムは破棄されますか? キューがガベージ コレクションされるときはどうですか?

答えが「いいえ」であると仮定すると、ベストプラクティスは何ですか? 常にキューを反復処理して、各アイテムを破棄する必要がありますか?

特に、例外がスローされた場合に備えて、最後に各破棄を試行する必要がある場合は、醜くなる可能性があります。

編集

したがって、一般的なコレクションのユーザーには、アイテムが使い捨て可能 (ガベージ コレクターによってクリーンアップされないアンマネージド リソースを使用している可能性が高いことを意味します) の場合、次のことを知る負担があるようです。

  1. コレクションから項目を削除するときは、必ず Dispose() してください。
  2. Clear() を呼び出さないでください。コレクションを繰り返し処理し、各アイテムを破棄します。

おそらく、ジェネリック コレクションのドキュメントにそのことが記載されているはずです。

4

4 に答える 4

5

ジェネリック コレクションは、含まれているオブジェクトの型について実際には何も認識していないため、Clear を呼び出しても、項目に対して Dispose() を呼び出すことはありません。コレクション自体が破棄されると、GC は最終的にそれらを破棄します。

コレクションで Clear を呼び出したときにオブジェクトの Dispose メソッドが呼び出されるようにするには、独自のコレクションを派生させ、適切なメソッドをオーバーライドして、自分で呼び出しを行う必要があります。

于 2009-01-30T19:04:07.417 に答える
4

それらはいつ処分されると思いますか?コレクション内のオブジェクトへの他の参照があるかどうか、コレクションはどのように認識しますか?

于 2009-01-30T18:58:12.763 に答える