5

リストの再帰的なリストを作成すると:

class myList
{
  List<myList> childLists;
  List<string> things;

  //...
}

List<myList> tempList = new List<myList>();

その後、tempList.Clear() を呼び出します。メモリ内のすべての childLists を破棄しますか?それとも最初にすべての childLists をクリアする再帰メソッドを作成する必要がありますか?

4

4 に答える 4

10

子リストへの他の参照が存在しない場合、それらは通常どおりガベージ コレクションされます。秘訣は、子アイテムへのぶら下がっている参照を監視することです (特に、データバインディングは一度行われると気付かれない傾向があります)。

于 2008-11-10T18:14:51.713 に答える
4

あなたは C++ のバックグラウンドを持っているようです。

.NET のガベージ コレクションを読むと、多くのことが明らかになるはずです。

あなたの場合、すべての子リストを「破棄」する必要はありません。実際、一般的な List オブジェクトを、通常の適切な .NET の方法で自分で破棄または破棄することはできません。もう使用したくない場合は、それへのすべての参照を削除してください。オブジェクトの実際の破棄は、ガベージ コレクター (別名 GC) が適切と判断したときに行われます。

GC も非常にスマートで、循環参照と a->b->c->d オブジェクト ツリー、および発生する可能性のあるほとんどのものを検出し、オブジェクト グラフ全体を適切にクリーンアップします。したがって、再帰的なクリーニング ルーチンを作成する必要はありません。

ただし、GC の動作は非決定的であることに注意してください。つまり、実際の「クリーンアップ」がいつ行われるかはわかりません。そのため、ファイル ハンドル、データベース接続など、すぐに解放する必要がある重要なリソースがリストに含まれている場合は、明示的に「破棄」する必要があります。 @lassevkが推奨するように。

于 2008-11-10T19:25:09.667 に答える
1

サブリストをクリアする必要はありません。

リスト内のオブジェクトが IDisposable を実装している場合は、リストをクリアする前に、オブジェクトを反復処理して .Dispose() メソッドを呼び出す必要があります。

于 2008-11-10T18:20:09.410 に答える
0

リスト オブジェクトを null に設定できます。http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/31809230-83f6-4e86-9a33-ee7dc4ec2b10 を確認してください

于 2010-12-17T11:03:46.367 に答える