-2

コレクションからアイテムを削除すると、.net 側で何が起きますか? 削除項目への参照はまだ有効ですか?

class myObject
{
    int i = 1;
}
...
public ObservableCollection<myObject> myObjects = new ObservableCollection<myObject>();
...
myObjects.Add(new myObject());
myObjects.Add(new myObject());

myObject removedItem = myObjects[1];
myObjects.RemoveAt(1);

// removedItem still valid ?
4

3 に答える 3

5

はい、アプリケーション内の別の変数によってまだ参照されているため、ガベージ コレクションによって取得されることはありません。

于 2012-12-20T13:46:37.320 に答える
1

はい、C# では、オブジェクトへの参照を保持している限り、オブジェクトは存在し、ガベージ コレクターはそのメモリを解放しません。removedItemオブジェクトへの参照です。はい、removedItem問題なく参照されるオブジェクトを使用できます。

于 2012-12-20T13:47:38.133 に答える
1

myObjectは参照型であるため、コレクションには実際のオブジェクトへの 参照のみが含まれます。

myObject removedItem = myObjects[1];そうすると、1 つのオブジェクトへの 2 つの参照ができます。

コレクションからアイテムを削除すると、オブジェクトではなくコレクションから参照が削除されるだけです。これは重要な概念です。

したがって、そうするとmyObjects.RemoveAt(1);、1つのオブジェクトへの1つの参照になります。重要なことに、オブジェクトにはremovedItemそれを参照する変数がまだあります

オブジェクトへの参照がある間、ガベージ コレクターはメモリを解放しようとしません。

removedItem別の値 null が割り当てられると、または範囲外にmyObjectなると、参照がなくなり (もう作成していないと仮定して)、ガベージ コレクションのマークが付けられ、有効ではなくなります。

ただし、実際には、ガベージ コレクターはメモリが解放されることを保証しますが、いつ解放されるかは保証しないため、より長くメモリに留まる可能性があります。(この最後の部分は、おそらくあなたの目的にとっては重要ではありませんが、言及する価値はあります。)

于 2012-12-20T14:27:15.797 に答える