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

Метод 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 и В2, которые являются копиями A и B. В2, в свою очередь, ссылается на новый объект 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
Вернуться в начало
Показ: