Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Перевод
Английский

Метод Object.MemberwiseClone ()

 

Опубликовано: Октябрь 2016

Создает неполную копию текущего объекта Object.

Пространство имен:   System
Сборка:  mscorlib (в mscorlib.dll)

protected object MemberwiseClone()

Возвращаемое значение

Type: System.Object

Неполная копия объекта Object.

MemberwiseClone Метод создает неполную копию путем создания нового объекта, а затем скопировать нестатические поля текущего объекта в новый объект. Если поле имеет тип значения, выполняется копирование бит за битом поля. Если поле имеет ссылочный тип, копируется ссылка, а не соответствующем объекте; Поэтому исходный объект и его копия относятся к тому же объекту.

Например рассмотрим объект, называемый X, который ссылается на объекты A и B. объект B, в свою очередь, ссылается на объект C. Неполная копия X создает новый объект X2, который также ссылается на объекты A и B. Напротив глубокая копия X создает новый объект X2, который ссылается на новые объекты, A2 и B2, которые являются копиями A и B. B2, в свою очередь, ссылается на новый объект C2, который является копией C. В примере показано различие между поверхностная и операции глубокую копию.

Существует множество способов реализации операции глубокую копию, если выполняемые операции Неполная копия MemberwiseClone метод не соответствует вашим потребностям. , включая следующие основные параметры:

  • Вызовите конструктор класса объекта для копирования для создания второго объекта значениями свойств, которые берутся из первого объекта. Это предполагает, что значения объекта полностью определяется его конструктор.

  • Вызов MemberwiseClone метод создания неполную копию объекта, а затем назначить новые объекты, значения которых совпадают с исходным объектом, чтобы любые свойства или поля, значения которого являются ссылочными типами. DeepCopy Метод в этом примере демонстрируется этот подход.

  • Сериализовать объект для получения его глубокой копии, а затем восстановить сериализованные данные в другую объектную переменную.

  • Используйте отражение с рекурсии для создания глубокой копии.

В следующем примере демонстрируется MemberwiseClone метод. Он определяет ShallowCopy метода, который вызывает MemberwiseClone метод, чтобы выполнить операцию неполную копию на Person объект. Он также определяет DeepCopy метод, выполняющий операцию глубокую копию Person объекта.

using System;

public class IdInfo
{
    public int IdNumber;

    public IdInfo(int IdNumber)
    {
        this.IdNumber = IdNumber;
    }
}

public class Person 
{
    public int Age;
    public string Name;
    public IdInfo IdInfo;

    public Person ShallowCopy()
    {
       return (Person) this.MemberwiseClone();
    }

    public Person DeepCopy()
    {
       Person other = (Person) this.MemberwiseClone();
       other.IdInfo = new IdInfo(IdInfo.IdNumber);
       other.Name = String.Copy(Name);
       return other;
    }
}

public class Example
{
    public static void Main()
    {
        // Create an instance of Person and assign values to its fields.
        Person p1 = new Person();
        p1.Age = 42;
        p1.Name = "Sam";
        p1.IdInfo = new IdInfo(6565);

        // Perform a shallow copy of p1 and assign it to p2.
        Person p2 = p1.ShallowCopy();

        // Display values of p1, p2
        Console.WriteLine("Original values of p1 and p2:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);

        // Change the value of p1 properties and display the values of p1 and p2.
        p1.Age = 32;
        p1.Name = "Frank";
        p1.IdInfo.IdNumber = 7878;
        Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);

        // Make a deep copy of p1 and assign it to p3.
        Person p3 = p1.DeepCopy();
        // Change the members of the p1 class to new values to show the deep copy.
        p1.Name = "George";
        p1.Age = 39;
        p1.IdInfo.IdNumber = 8641;
        Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p3 instance values:");
        DisplayValues(p3);
    }

    public static void DisplayValues(Person p)
    {
        Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age);
        Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber);
    }
}
// The example displays the following output:
//       Original values of p1 and p2:
//          p1 instance values:
//             Name: Sam, Age: 42
//             Value: 6565
//          p2 instance values:
//             Name: Sam, Age: 42
//             Value: 6565
//       
//       Values of p1 and p2 after changes to p1:
//          p1 instance values:
//             Name: Frank, Age: 32
//             Value: 7878
//          p2 instance values:
//             Name: Sam, Age: 42
//             Value: 7878
//       
//       Values of p1 and p3 after changes to p1:
//          p1 instance values:
//             Name: George, Age: 39
//             Value: 8641
//          p3 instance values:
//             Name: Frank, Age: 32
//             Value: 7878

In this example, the Person.IdInfo property returns an IdInfo object. As the output from the example shows, when a Person object is cloned by calling the M:System.Object.MemberwiseClone method, the cloned Person object is an independent copy of the original object, except that they share the same Person.IdInfo object reference. As a result, modifying the clone's Person.IdInfo property changes the original object's Person.IdInfo property. On the other hand, when a deep copy operation is performed, the cloned Person object, including its Person.IdInfo property, can be modified without affecting the original object.

Универсальная платформа Windows
Доступно с 8
.NET Framework
Доступно с 1.1
Переносимая библиотека классов
Поддерживается в: переносимые платформы .NET
Silverlight
Доступно с 2.0
Windows Phone Silverlight
Доступно с 7.0
Windows Phone
Доступно с 8.1
Вернуться в начало
Показ: