Язык программирования C#9 и платформа .NET5. Страница 178
Интерфейс ICloneable
Вспомните из главы 6, что в классе
System.ObjectMemberwiseClone()MemberwiseClone()CloneablePointPointusing System;namespace CloneablePoint{ // Класс по имени Point. public class Point { public int X {get; set;} public int Y {get; set;} public Point(int xPos, int yPos) { X = xPos; Y = yPos;} public Point(){} // Переопределить Object.ToString(). public override string ToString() => $"X = {X}; Y = {Y}"; }}Учитывая имеющиеся у вас знания о ссылочных типах и типах значений (см.главу 4), должно быть понятно, что если вы присвоите одну переменную ссылочного типа другой такой переменной, то получите две ссылки, которые указывают на тот же самый объект в памяти. Таким образом, следующая операция присваивания в результате дает две ссылки на один и тот же объект
PointConsole.WriteLine("***** Fun with Object Cloning *****\n");// Две ссылки на один и тот же объект!Point p1 = new Point(50, 50);Point p2 = p1;p2.X = 0;Console.WriteLine(p1);Console.WriteLine(p2);Console.ReadLine();Чтобы предоставить специальному типу возможность возвращения вызывающему коду идентичную копию самого себя, можно реализовать стандартный интерфейс
ICloneableICloneableClone()public interface ICloneable{ object Clone();}Очевидно, что реализация метода
Clone()Point// Теперь Point поддерживает способность клонирования.public class Point : ICloneable{ public int X { get; set; } public int Y { get; set; } public Point(int xPos, int yPos) { X = xPos; Y = yPos; } public Point() { } // Переопределить Object.ToString(). public override string ToString() => $"X = {X}; Y = {Y}"; // Возвратить копию текущего объекта. public object Clone() => new Point(this.X, this.Y);}Теперь можно создавать точные автономные копии объектов типа
PointConsole.WriteLine("***** Fun with Object Cloning *****\n");...// Обратите внимание, что Clone() возвращает простой тип object.// Для получения производного типа требуется явное приведениеPoint p3 = new Point(100, 100);Point p4 = (Point)p3.Clone();// Изменить р4.Х (что не приводит к изменению р3.Х).p4.X = 0;// Вывести все объекты.Console.WriteLine(p3);Console.WriteLine(p4);Console.ReadLine();Несмотря на то что текущая реализация типа
PointPointClone()// Копировать все поля Point по очереди.public object Clone() => this.MemberwiseClone();Тем не менее, учтите, что если бы в типе
PointMemberwiseClone()Более сложный пример клонирования
Теперь предположим, что класс
PointPointDescriptionSystem.Guid