Я подтверждаю ответ от @docesam и часть ответа от @Will Yu.
Это не мелкая и не глубокая копия, это справочная копия.- docesam
оЬ2 = OB1; Этот код создает две ссылки на объекты, которые относятся к одному и тому же объекту. Поэтому любые изменения объекта, созданного с помощью ob1, будут отражены в последующих применениях ob2. --будет Ю.
По MSDN (see Remarks):
Мелкая копия массива копий только элементы массива, являются ли они ссылочные типы или типы значений, но это не делает скопируйте объекты, на которые ссылаются ссылки. Ссылки в новом массиве указывают на те же объекты, на которые указывают ссылки в исходном массиве.
Здесь есть две вещи, чтобы отметить:
- неполную копию копии элементов.
- Неглубокая копия сохраняет исходные ссылки элементов.
Далее, позвольте мне объяснить эти два отдельно.
Начнем с того, мы создаем Person
класс с Name
собственности:
class Person
{
public string Name {get; set;}
}
Затем в методе Main()
мы создаем Person
массив.
// Create 2 Persons.
var person1 = new Person(){ Name = "Jack" };
var person2 = new Person(){ Name = "Amy" };
// Create a Person array.
var arrPerson = new Person[] { person1, person2 };
1. неполную копию копии элементов.
Если мы заменить первый элемент в мелкой копии, исходный массив не должен быть затронуты:
// Create a shallow copy.
var arrPersonClone = (Person[]) arrPerson.Clone();
// Replace an element in the shallow copy.
arrPersonClone[0] = new Person(){Name = "Peter"};
// Display the contents of all arrays.
Console.WriteLine("After replacing the first element in the Shallow Copy");
Console.WriteLine($"The Original Array: {arrPerson[0].Name}, {arrPerson[1].Name}");
Console.WriteLine($"The Shallow Copy: {arrPersonClone[0].Name}, {arrPersonClone[1].Name}");
Результаты:
The Original Array: Jack, Amy
The Shallow Copy: Peter, Amy
2. Мелкий копия сохраняет исходные ссылки элементов.
Если мы изменить свойства элемента в мелкой копии, исходный массив будет затронут, так как объект, который этот элемент делает ссылку не копируется.
// Create a new shallow copy.
arrPersonClone = (Person[]) arrPerson.Clone();
// Change the name of the first person in the shallow copy.
arrPersonClone[0].Name = "Peter";
// Display the contents of all arrays.
Console.WriteLine("After changing the Name property of the first element in the Shallow Copy");
Console.WriteLine($"The Original Array: {arrPerson[0].Name}, {arrPerson[1].Name}");
Console.WriteLine($"The Shallow Copy: {arrPersonClone[0].Name}, {arrPersonClone[1].Name}");
Результаты:
The Original Array: Peter, Amy
The Shallow Copy: Peter, Amy
Так как же простой знак равенства, =
, ведут себя?
Он делает справочную копию. Любое изменение элементов или упомянутых объектов будет отражено как в исходном массиве, так и в «скопированном» массиве.
// Create a reference copy.
var arrPersonR = arrPerson;
// Change the name of the first person.
arrPersonR[0].Name = "NameChanged";
// Replace the second person.
arrPersonR[1] = new Person(){ Name = "PersonChanged" };
// Display the contents of all arrays.
Console.WriteLine("After changing the reference copy:");
Console.WriteLine($"The Original Array: {arrPerson[0].Name}, {arrPerson[1].Name}");
Console.WriteLine($"The Reference Copy: {arrPersonR[0].Name}, {arrPersonR[1].Name}");
Результаты:
The Original Array: NameChanged, PersonChanged
The Reference Copy: NameChanged, PersonChanged
В заключении, ob2 = ob1
не неполная копия, но ссылка копия.
Полный код, чтобы играть с:
void Main()
{
// Create 2 Persons.
var person1 = new Person(){ Name = "Jack" };
var person2 = new Person(){ Name = "Amy" };
// Create a Person array.
var arrPerson = new Person[] { person1, person2 };
// ----------- 1. A shallow copy copies elements. -----------
// Create a shallow copy.
var arrPersonClone = (Person[]) arrPerson.Clone();
// Replace an element in the shallow copy.
arrPersonClone[0] = new Person(){Name = "Peter"};
// Display the contents of all arrays.
Console.WriteLine("After replacing the first element in the Shallow Copy:");
Console.WriteLine($"The Original Array: {arrPerson[0].Name}, {arrPerson[1].Name}");
Console.WriteLine($"The Shallow Copy: {arrPersonClone[0].Name}, {arrPersonClone[1].Name}");
Console.WriteLine("\n");
// ----------- 2. A shallow copy retains the original references of the elements. -----------
// Create a new shallow copy.
arrPersonClone = (Person[]) arrPerson.Clone();
// Change the name of the first person in the shallow copy.
arrPersonClone[0].Name = "Peter";
// Display the contents of all arrays.
Console.WriteLine("After changing the Name property of the first element in the Shallow Copy:");
Console.WriteLine($"The Original Array: {arrPerson[0].Name}, {arrPerson[1].Name}");
Console.WriteLine($"The Shallow Copy: {arrPersonClone[0].Name}, {arrPersonClone[1].Name}");
Console.WriteLine("\n");
// ----------- 2. The equal sign. -----------
// Create a reference copy.
var arrPersonR = arrPerson;
// Change the name of the first person.
arrPersonR[0].Name = "NameChanged";
// Replace the second person.
arrPersonR[1] = new Person(){ Name = "PersonChanged" };
// Display the contents of all arrays.
Console.WriteLine("After changing the reference copy:");
Console.WriteLine($"The Original Array: {arrPerson[0].Name}, {arrPerson[1].Name}");
Console.WriteLine($"The Reference Copy: {arrPersonR[0].Name}, {arrPersonR[1].Name}");
}
class Person
{
public string Name {get; set;}
}
Это неполную копию. –
Страница Википедии об объектном копировании: http://en.wikipedia.org/wiki/Object_copy – Jerome
@ VaughanHilts - Я бы не назвал это «мелкой копией», поскольку код выше не выполняет никакой копии 'obj1' вообще. –