Когда вы делаете это:
ArrayList returnList = ReceivedPackets;
Вы создаете новую переменную с именем returnList
, но эта переменная указывает на тот же объект в памяти, что и ReceivedPackets
. По-прежнему существует только один фактический ArrayList
, просто на него указывают две переменные. Таким образом, изменения, внесенные в один, отражаются в обоих.
Как я могу обойтись без потери значения returnList?
Создайте новый объект. В простейшем случае это будет выглядеть так:
ArrayList returnList = new ArrayList();
Если вы также хотите, чтобы этот объект содержал все значения из ReceivedPackets
, к счастью, ArrayList
имеет перегрузку конструктора, которая делает именно это:
ArrayList returnList = new ArrayList(ReceivedPackets);
Теперь у вас будет два объекта, которые должны содержать копии одних и тех же данных. Изменения в одном не будут отражаться в другом.
В отсутствие этого конструктора ArrayList
также имеет несколько CopyTo()
методов, которые можно использовать для копирования элементов из одного в другой. В противном случае вы также можете вручную перебрать исходный ArrayList
и скопировать элементы в место назначения ArrayList
.
Возможно это может привести к путанице, если сам ArrayList
содержит ссылочные объекты. Потому что они тоже могут иметь несколько «указателей» на один и тот же объект в памяти.
Например, если вы создаете один объект Widget
и добавляете его к двум объектам ArrayList
, то любые изменения, внесенные в объекты ArrayList
(добавление/удаление элементов), будут независимыми, но любые изменения, внесенные в объект Widget
, будут отражены в обоих объектах ArrayList
. .
Дело в том, что ArrayList
сам является объектом, независимым от содержащихся в нем объектов.
Таким образом, в зависимости от полного контекста того, что вы делаете, ваш пробег может варьироваться.
person
David
schedule
10.05.2016
ArrayList
является ссылочным типом - person Ehsan Sajjad   schedule 10.05.2016ReceivedPackets
иreturnList
— две ссылочные переменные, которые указывают на один и тот же объект в памяти. Изменения этого объекта будут отражены в обоих. - person David   schedule 10.05.2016ArraList.Copy()
метод, который вы должны использовать, илиArrayList returnList = new ArrayList(ReceivedPackets);
- person Ehsan Sajjad   schedule 10.05.2016