Объяснение о клоне необходим массив, содержащий клонируемые объекты

1

Я пытаюсь сделать следующий код:

public class cloneTest : ICloneable {

    public string strValue { get; set; }

    public object Clone( ) {
      cloneTest n = new cloneTest( );
      n.strValue = this.strValue;
      return n;     
    }
}

cloneTest obj1 = new cloneTest( ) { strValue = "one" };
cloneTest obj2 = new cloneTest( ) { strValue = "two" };
cloneTest obj3 = new cloneTest( ) { strValue = "three" };

cloneTest[ ] strValueArray = new cloneTest[  ] {obj1, obj2, obj3};

cloneTest[ ] strValueArrayClone = ( cloneTest[ ] )strValueArray.Clone( );
strValueArrayClone[ 2 ].strValue = "four";

Когда я изменяю объект strValuArrayClone, как указано в моем коде, это изменение также отражается в объекте strValueArray, хотя я создаю клон. Однако, если попробовать ниже кода, тогда все работает плавно. Я хочу понять логику этого.

cloneTest obj1 = new cloneTest( ) { strValue = "one" };
cloneTest obj2 = new cloneTest( ) { strValue = "two" };
cloneTest obj3 = new cloneTest( ) { strValue = "three" };

cloneTest[ ] strValueArray = new cloneTest[  ] {obj1, obj2, obj3};

cloneTest[ ] strValueArrayClone = ( cloneTest[ ] )strValueArray.Clone( );
cloneTest obj2clone = ( cloneTest )obj2.Clone( );
obj2clone.strValue = "six";
strValueArrayClone[ 2 ] = obj2clone;
Теги:
clone

1 ответ

2
Лучший ответ

Вы создаете клон массива, но с тем же содержимым. Метод массива Clone() - это мелкий клон. Поскольку содержимое является ссылкой, слоты в обоих массивах относятся к тем же экземплярам реальных объектов. В первом примере кода есть только 3 экземпляра cloneTest независимо от того, сколько массивов вы создаете со ссылками на эти 3 экземпляра. Если вы измените свойство на одном из этих трех объектов, он будет виден везде, где есть ссылка на этот объект, что означает через каждый массив.

Опции:

  • создать глубокий клон (т.е. клонировать внутренние элементы тоже, в момент клонирования массива)
  • клонировать объекты в точке изменения свойств (это то, что делает ваш второй образец кода)
    • особый случай заключается в том, чтобы сделать исходные типы неизменными, чтобы исключить такие случаи
  • 0
    Спасибо за объяснение. Я хочу понять, какую выгоду можно получить от мелкого клона?
  • 1
    @ User1551892 он дает вам изолированный снимок массива - перед тем, как вы начнете обмениваться ссылками и т. Д. Обратите внимание, что для типов значений это будет истинный клон их внутренних значений и т. Д., Но это почти всегда (т. Е.> 99% время) желательно сделать структуры неизменными в любом случае .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню