List<T>
内部にプライベートフィールドを持つ可変クラスがあります。Reset()
クラスのメソッドで、そのClear()
メソッドを使用してリストをクリアする必要がありますか、それともフィールドに新しいリストを割り当てるだけですか?リストは公開されておらず、クラス自体によってのみ使用されることに注意してください。したがって、新しいリストを割り当てると、古いリストにアクセスできなくなります。このClear()
メソッドはO(n)演算であるため、新しいリストを割り当てるだけのデメリットは何でしょうか。
3 に答える
私が考えることができる唯一の欠点は、リストを再度使用する必要がある場合は、新しいスペースを割り当てる必要があることです。
ヌルにすると、リストとそのコンテンツ(他の参照がないと仮定)がGCの対象になります。クリアするとアイテムは削除されますが、メモリは割り当てられたままになります。
個人的には、また必要になってもサイズが完全に変わってしまうので、無効にする傾向があります。
更新:以下のコメントに関連して、これらのオブジェクトはオブジェクトのプールで管理されると述べています。最終的な答えを得るために、小さなプロファイリングコンソールアプリを作成することをお勧めします。議論は現在、実装の詳細とオブジェクトプールの使用目的に踏み込んでおり、答えを簡単に変えることができます。
一般的に言って、長さがあまり変わらず、常に必要になるClear
リストがある場合は、リストに新しいメモリを割り当てないようにするために使用します。リストの長さが大幅に変更される可能性がある場合、または使用法がまばらな場合があります-メモリを再利用し、リストの遅延インスタンス化によっていくつかのマイナーな利点を得るには、リストの長さを無効にすることをお勧めします。
では、なぜそれを無効にするのですか?これはあなたのためにトリックを行い、古いリストをガベージコレクションのヒープに残し、リストにアクセスする既存のメソッドは新しい空のリストで機能し続けることができます。
this.FooList = new List<Foo>();
呼び出し後Reset
、コンストラクターが呼び出された後と同じ状態でオブジェクトを残します。
コンストラクターが新しい空を作成した場合List
は、それを実行します。そうでなければnull
。