Проблема с объектом List <T> - PullRequest
0 голосов
/ 24 июня 2011
List<Person> allPersons= ReadallPersons()

Person aPerson=allPersons[0];

aPerson.Name="test1";

allPersons.Add(aPerson)

allPersons имеет один объект person, я назначаю этот объект person в объект 'aPerson'. Просто переименуйте имя человека в 'test1' и снова добавьте его в список.

Теперь, если мы проверим список, Имя объекта обоих лиц будет назначено как 'test1'.

В чем проблема в этом?

Как мы можем разобраться в этом?

Ответы [ 5 ]

7 голосов
/ 24 июня 2011

Вам необходимо сделать копию объекта. Вы только копируете ссылку на тот же объект. Таким образом, обе записи указывают на одного и того же человека.

Если Person реализует IClonable, вы можете вызвать Clone (), изменить клон и добавить его в список.

2 голосов
/ 24 июня 2011

В списке хранятся ссылки, а не копии объектов. В результате, когда вы изменяете имя объекта и изменяете его, вы меняете и то, что в списке, и то, которое вы сохранили в aPerson, потому что это один и тот же объект.

Чтобы создать новый объект, вам нужно использовать оператор new и создать новый объект Person, а затем добавить его в список.

2 голосов
/ 24 июня 2011

Вы всегда работаете с одним и тем же объектом, вы добавляете его в список, вынимаете его, изменяете, добавляете его снова во вторую позицию ...

классы являются ссылочными типами, поэтому независимо от того, какМногие переменные, которые вы помещаете, все эти переменные всегда ссылаются на один и тот же объект в памяти, и вы изменяете его откуда-то, и все ссылки видят одни и те же обновленные данные.

0 голосов
/ 24 июня 2011

Когда вы делаете ...

Person aPerson = allPersons[0];

... вы получаете reference для объекта первого лица в списке, т. Е. Это точно такой же элемент, а не его копия.

См. Верхний ответ на этот вопрос о том, как сделать копию.

0 голосов
/ 24 июня 2011

Person aPerson = allPersons [0] копирует только ссылку на элемент в списке.

Вам потребуется использовать 'new' для создания нового экземпляра объекта, в противном случае он фактически копирует указательи любое изменение повлияет только на один объект.

List allPersons= ReadallPersons()

**Person aPerson= new Person();**

aPerson.Name='test1'

allPersons.Add(aPerson)

, или вы можете выполнить DeepCopy объекта, см. Как сделать глубокую копию объекта в .NET (особенно в C #)?.

...