2013-10-04 4 views
0

У меня есть класс, в котором я управляю некоторыми методами.Скопировать статическое поле

public class MyClass 
{ 
    public static List<ObjectA> MyField; 

    public static Object MyMethod() 
    { 
     List<ObjectA> anotherObjectA = new List<ObjectA>(); 
     // I do something with anotherObjectA... 
     // after processing something now I want to keep the current status of    anotherObjectA to MyField: 
     MyField = anotherObjectA; 
     // and now I want to work just with anotherObjectA. The problem is that whatever I work with anotherObjectA it changes also MyField 

} 
} 

Как я могу добиться того, что я пытаюсь сделать

+2

'MyField' и' anotherObjectA' ссылаются на один и тот же объект. Вы должны создать два объекта. –

+0

Я попытался создать публичный статический список MyField = новый Список (); Но все же тот же – Drill

+0

Список является ссылочным типом. поэтому сделать копию, как и вы, добавит вторую ссылку на тот же объект. Вам нужно создать новый объект 'MyField = anotherObjectA.ToList()' – hwcverwe

ответ

1

MyField и anotherObjectA справка такой же объект. Поэтому, если вы измените MyField, он также изменит anotherObjectA.

Так Прежде всего, необходимо создать два объекта списка:

MyField = new List<ObjectA>(anotherObjectA); 

Это создаст два списка объектов, но ObjectA объекты внутри списка по-прежнему ссылается на то же самое.

MyField.First() == anotherObjectA.First() // returns true; 

Если вы хотите сделать полную копию также необходимо создать копию объектов внутри anotherObjectA

public class ObjectA 
{ 
    public ObjectA() { } // Normal constructor 
    public ObjectA(ObjectA objToCopy) { /* copy fields into new object */ } 
} 

MyField = anotherObjectA.Select(obja => new ObjectA(obja)).ToList(); 

с этим решением, изменение объектов внутри MyField не будет воздействовать на объекты внутри anotherObjectA если Objecta также содержит ссылочные типы.

7

Вы можете сделать

MyField = new List<ObjectA>(anotherObjectA); 

Это создаст копию списка. Однако любые изменения объектов в списке будут видны в обоих. Вы должны сами решить, насколько глубока ваша копия. Если вам действительно нужна глубокая копия, вам необходимо предоставить механизм для ObjectA, чтобы сделать копию самого себя, перебрать исходный список и добавить копию каждого объекта в целевой список.

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