0

私はArrayListを持っています:

ArrayList ReceivedPackets = new ArrayList();

そして、私は別の ArrayList を持っています:

ArrayList returnList = ReceivedPackets;

このコードを実行するとreturnListの値が失われるのはなぜですか?

ArrayList ReceivedPackets = new ArrayList();  // ReceivedPackets is empty
ReceivedPackets.Add(1);                       // Now it has an Integer
ArrayList returnList = ReceivedPackets;       // Call-by-Reference (I thought), returnList now has an Integer
ReceivedPackets.clear();                      // returnList is empty now. Why?
4

2 に答える 2

2

これを行う場合:

ArrayList returnList = ReceivedPackets;

という新しい変数を作成していますが、この変数は と同じメモリ内オブジェクトreturnList指しています。実際の はまだ 1 つしかなく、それを指す 2 つの変数しかありません。したがって、一方に加えられた変更は両方に反映されます。ReceivedPacketsArrayList

returnList の値を失わずにどうすればよいですか?

新しいオブジェクトを作成します。最も単純には、次のようになります。

ArrayList returnList = new ArrayList();

そのオブジェクトに からのすべての値も含めたい場合はReceivedPackets、幸いなことArrayListに、それを行うコンストラクターのオーバーロードがあります。

ArrayList returnList = new ArrayList(ReceivedPackets);

これで、同じデータのコピーを含む 2 つのオブジェクトができました。一方を変更しても他方には反映されません。


そのコンストラクターがない場合、要素をある要素から別の要素にコピーするために使用できるArrayListいくつかのメソッドもあります。CopyTo()それができない場合は、ソースArrayListを手動でループして要素をコピー先にコピーすることもできますArrayList

自体参照オブジェクトが含まれている場合、これはかなり混乱する可能性があります。それらも同じメモリ内オブジェクトへの複数の「ポインタ」を持つ可能性があるためです。ArrayList

たとえば、1 つのオブジェクトを作成しWidgetて 2 つのオブジェクトに追加した場合、オブジェクトに加えArrayListられた変更ArrayList(要素の追加/削除) は独立していますが、Widgetオブジェクトに加えられた変更は両方の に反映されますArrayList

ポイントは、ArrayList それ自体がオブジェクトであり、含まれるオブジェクトとは無関係であるということです。

したがって、あなたがしていることの完全なコンテキストに応じて、マイレージは異なる場合があります.

于 2016-05-10T14:59:35.380 に答える
1

ArrayListは参照型です。つまり、そのインスタンスに変数を割り当てるだけで、両方のオブジェクトがメモリ内の同じ場所を指します。

ディープ コピーを作成する場合は、新しいオブジェクトを作成します。

static void Main() {
    ArrayList a = new ArrayList() {1,2,3};
    var b = a;
    var c = new ArrayList(a);

    a.Clear();
    Console.WriteLine(a.Count); // 0
    Console.WriteLine(b.Count); // 0
    Console.WriteLine(c.Count); // 3
}
于 2016-05-10T15:03:24.497 に答える