1

この状況を考えてみましょう。Form1は、大量の要素を含むListオブジェクトを作成します。次に、このコレクションをパラメーターを介してForm2に渡す必要があります。

Form2でコレクションのハードコピーを作成した後、Form1のコレクションに関連するすべてをクリアしたいと思います。Col1をForm1のコレクションの識別子とします。

Col1はパラメーターを介して参照によって渡されるため、Col1.Clear()を呼び出して要素をクリアし、次にCol1.TrimExcess()を呼び出して実際のサイズを0に減らし、大量のnull値。

私の意図は、使用されているすべてのメモリをできるだけ早くクリアすることです。Col1.TrimExcess()は使用されているすべてのメモリをクリアする必要がありますが、私の(またはほとんどの)ケースでCol1 = nullの方がうまくいくかどうか知りたいですか?

4

3 に答える 3

5

Col1.Clear()を呼び出して要素をクリアしてから、Col1.TrimExcess()を呼び出す方が適切なアプローチだと思います。これは、Col1 = nullはリストを逆参照するだけですが、GCが機能するまではメモリ内にあるためです。 。

Col1.Clear()を呼び出すと、リスト自体からリストの項目が逆参照され、Col1.TrimExcess()がリストからすべての空の要素を削除します。

したがって、このようにして、メモリ内のすべての参照が削除されます。

それが役に立てば幸い...

于 2012-07-16T14:25:55.703 に答える
2

これを行っているのは、form1 の内容を「準備」してから、準備が整った内容を Form2 に渡して、ある種の遅延などを回避できるからだと思いますが、正しいですか? いずれにせよ、考慮すべき問題がいくつかあります。

Tim Schmelter が指摘しているように、フォーム 2 からリスト "X" への参照を追加してもコピーは作成されず、X への新しい参照のみが作成されます。X はまだ存在するため、フォーム 2 から X への参照を削除してもメモリは減少しません。 -それへのポインターで1つだけ少なくなります。ただし、リストのハード コピーを作成する場合は、元のリストへの参照とそこに含まれるデータをすべて削除することで、実際にメモリを節約できます。(ただし、リストのディープ コピーは必ずしも簡単ではないことに注意してください... )

使用する天気と についてclear()TrimExcess()、通常、これらは正当な理由で組み込まれていると想定し、非常にうまく機能することを期待しています。いずれにせよ、それらがコードの速度に大きな影響を与えるとは思えません。

また、 を使用することを選択する必要がcol = nullある場合は、null 値を持つ変数になり (明らかに...)、他のオプションは空の (ただし null ではない) リストになります。私が間違っていなければ、リストを「手動で」長さゼロにトリミングするのと同じことは、リストをnullに設定するのではなく、新しい(空の)リストを指すことcol = new List()ですが、CPUサイクルを節約できるとは思えません.

要するに、最初のように先に進み、組み込みのメソッドを使用することをお勧めします。

于 2012-07-16T14:35:21.910 に答える
1

したがって、MSDN :

List を初期状態にリセットするには、TrimExcess メソッドを呼び出す前に Clear メソッドを呼び出します。空のリストをトリミングすると、リストの容量がデフォルトの容量に設定されます。

したがって、あなたのアプローチは正しいと思います。

于 2012-07-16T14:29:23.710 に答える