c # List <myObject>myList.copyTo () сохраняет ссылку? - PullRequest
2 голосов
/ 20 августа 2009

У меня есть список, и я использовал метод .copyTo (). Таким образом, он копирует мой список в одномерный массив.

Итак, я зацикливаю этот массив и добавляю каждый myObject в другой список, а затем меняю вещи в этом новом списке.

После этого я показываю разницу между новыми значениями в моем втором Списке и старыми значениями в моем первом Списке. Но всегда нет разницы. Поэтому я думаю, что метод copyTo () сохраняет ссылку.

Существуют ли другие методы, которые не сохраняют ссылку?

Ответы [ 2 ]

8 голосов
/ 20 августа 2009

Да. .CopyTo () выполняет поверхностное копирование, что означает, что он копирует ссылки. Для клонирования каждого объекта вам нужна глубокая копия.

Лучший способ сделать так, чтобы класс myObject реализовал IClonable

public class YourClass 
{
    public object Clone()
    {
        using (var ms = new MemoryStream())
        {
           var bf = new BinaryFormatter();

           bf.Serialize(ms, this);
           ms.Position = 0;

           object obj = bf.Deserialize(ms);
           ms.Close();

           return obj;
        }
    }
}

Затем вы можете использовать .Clone () для каждого объекта и добавить его в новый список.

List<YourClass> originalItems = new List<YourClass>() { new YourClass() };
List<YourClass> newItemList = originalItems.Select(x => x.Clone() as YourClass).ToList();
2 голосов
/ 20 августа 2009

Если у вас есть список типов ссылок и вы используете метод CopyTo для копирования в массив, содержимое списка, которое является ссылками , будет скопировано, поэтому при изменении объекты в вашем массиве, они все равно будут ссылаться на те же объекты в куче, на которые ссылаются из вашего списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...