2016-03-07 4 views
-1

У меня есть следующий код:Изменение объекта в списке

List<Foo> test = new List<Foo>(); 
test.Add(new Foo(2)); 
List<Foo> test2 = new List<Foo>(); 
test2.Add(test[0]); 
test2[0] = new Foo(3); 

Когда я назначить новый объект test2[0], test[0] делает не изменений. Как я могу изменить test[0] через test2[0]?

EDIT:

Итак, у меня уже есть два объекта. В конце я хочу изменить первый объект на второй объект.

Foo bar0 = new Foo(2); 
Foo bar1 = new Foo(3); 
List<Foo> test = new List<Foo>(); 
test.Add(bar0); 
List<Foo> test2 = new List<Foo>(); 
test2.Add(test[0]); 
// now what? 
+0

Если вы редактируете объект вместо его замены, он будет делать то, о чем вы думаете. – Vlad274

+0

Простейшим способом является просто «List test2 = test'. Хотя я не знаю, действительно ли это нужно. –

+0

@ Vlad274: Я хочу заменить объект. – gartenriese

ответ

1

Когда вы сделаете это:

test2[0] = new Foo(3); 

Вы не изменяя объект в test2[0], вы изменяете test2 сам. И модификация, которую вы делаете, заключается в том, что вы помещаете новый объект в определенный индекс.

Это ничего не делает для объекта, который раньше был там. Не стоит.

Если вы хотите изменить объект, который есть, вы можете изменить его напрямую:

test2[0].SomeProperty = someValue; 

И наоборот, если вы хотите test2 и test быть тот же набор (так что изменение одного также модифицирует другой) , а затем сделать их же коллекции:

List<Foo> test = new List<Foo>(); 
//... 
List<Foo> test2 = test; 

Но пока test и test2 две отдельные экземпляры, то изменения в одной не отражаются в другом. Опять же, и не должно быть.


Если вы хотите этого поведения (модификации одного экземпляра, отражаясь в другом), то вы, вероятно, придется создать свою собственную реализацию коллекции. Который не должен быть ужасно трудным. Просто создайте пользовательский класс, который наследуется от IList<T>. В реализации этого класса вы могли бы сохранить данные резервного копирования для коллекции в свойстве static.

Я не уверен, какие другие побочные эффекты могут иметь, так как я никогда не слышал о желании этого поведения раньше. Но, по крайней мере, член static будет отражать изменение во всех экземплярах класса.

+0

Я пытаюсь заменить 'test [0]' новым объектом. Это возможно? – gartenriese

+0

@gartenriese: Да. 'test [0] = new Foo (3);« Поведение, которое вы ожидаете * ожидаете *, просто не так, как работает объектно-ориентированная разработка. Изменение одного экземпляра объекта не изменяет другие экземпляры того же типа. В качестве аналогии рассмотрим два одинаковых автомобиля. Такая же модель, в том же году, того же цвета, то же самое. Если вы положите что-то в багажник одной из этих двух машин, он не будет * также * находиться в багажнике другого автомобиля. В вашем случае, если вы хотите нестандартное поведение, вам необходимо реализовать свой собственный объект. (Ваш собственный 'IList ') – David

+0

Я иду из C++, так что это для меня ново. С C++ я бы сохранил указатели в массиве, и я мог бы просто указать указателю на новый объект, и я думал, что объекты на C# ведут себя одинаково, поэтому я и попытался. – gartenriese

0

Они 2 разные списки, 2 разные экземпляры, вы не можете сделать это, если вы не делаете:

test2 = test 

Можете ли вы объяснить, почему вам это нужно сделать так, как вы это делаете?

Смежные вопросы