Я пытаюсь сделать следующий код:
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()
- это мелкий клон. Поскольку содержимое является ссылкой, слоты в обоих массивах относятся к тем же экземплярам реальных объектов. В первом примере кода есть только 3 экземпляра cloneTest
независимо от того, сколько массивов вы создаете со ссылками на эти 3 экземпляра. Если вы измените свойство на одном из этих трех объектов, он будет виден везде, где есть ссылка на этот объект, что означает через каждый массив.
Опции: