Чтобы сделать глубокую копию объекта, нужно его клонировать. Когда мы используем оператор =
, мы не клонируем объект; вместо этого мы ссылаемся на нашу переменную на тот же объект (т. е. на мелкую копию ).
Другими словами, изменение значение одной переменной влияет на значение другой переменной, потому что они ссылаются (или указывают) на один и тот же объект. С глубокой копией дело обстоит иначе; разница между мелкой и глубокой копией заключается в том, что изменение значений объекта глубокой копии не изменяет исходный объект (в отличие от поверхностного копирования).
Код
Давайте создадим класс Person
, у которого будет имя
, ID и age
. Атрибут ID
будет содержать объект класса PersonID
. Этот класс также будет включать метод DeepCopy
, который вернет полную копию объекта. См. Код ниже:
class DeepCopyDemo {static void Main (string [] args) {Person p1 = new Person (); p1.name = "Хасан"; p1.age = 22; p1.ID = новый PersonID (3343); //Вызов метода DeepCopy () Person p2 = p1.DeepCopy (); System.Console.WriteLine («Перед изменением:»); //Значение атрибутов c1 и c2 перед изменением//значений System.Console.WriteLine ("p1 instance values:"); System.Console.WriteLine ("Имя: {0: s}, Возраст: {1: d}", p1.name, p1.age); System.Console.WriteLine ("Значение: {0: d}", p1.ID.IDNumber); System.Console.WriteLine ("значения экземпляра p2:"); System.Console.WriteLine ("Имя: {0: s}, Возраст: {1: d}", p2.name, p2.age); System.Console.WriteLine ("Значение: {0: d}", p2.ID.IDNumber); //Изменение атрибутов p1 p1.name = "Hamza"; p1.age = 20; p1.ID.IDNumber = 4344; System.Console.WriteLine (" nПосле изменения атрибутов p1:"); //Значение атрибутов c1 и c2 после изменения//значений System.Console.WriteLine ("p1 instance values:"); System.Console.WriteLine ("Имя: {0: s}, Возраст: {1: d}", p1.name, p1.age); System.Console.WriteLine ("Значение: {0: d}", p1.ID.IDNumber); System.Console.WriteLine ("значения экземпляра p2:"); System.Console.WriteLine ("Имя: {0: s}, Возраст: {1: d}", p2.name, p2.age); System.Console.WriteLine ("Значение: {0: d}", p2.ID.IDNumber); }}; открытый класс PersonID {public int IDNumber; public PersonID (int id) {это. IDNumber = id; }} открытый класс Person {public int age; публичное строковое имя; общедоступный идентификатор PersonID; public Person DeepCopy () {Человек temp = (Человек) this.MemberwiseClone (); temp.ID = новый PersonID (this.ID.IDNumber); temp.name = this.name; возвратная температура; }}
this.MemberwiseClone ()
создаст неглубокую копию объекта p1
. Однако, чтобы преобразовать этот клон ( p2
) в глубокую копию, атрибуту ID
нужно будет присвоить новый PersonID
, и ссылка на вновь выделенный объект будет отличаться от ссылки на p1.ID
. Это означает, что изменение p2.ID
не изменит p1.ID
, как видно из вывода.