本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

Object.MemberwiseClone 方法 ()

 

创建当前 Object 的浅表副本。

命名空间:   System
程序集:  mscorlib(位于 mscorlib.dll)

protected object MemberwiseClone()

返回值

Type: System.Object

当前 Object 的浅表副本。

MemberwiseClone 方法通过创建一个新对象,然后将当前对象的非静态字段复制到新的对象来创建的浅表副本。 如果一个字段是值类型,则执行该字段的逐位复制。 如果一个字段是引用类型,则将引用复制但被引用的对象不;因此,原始对象和其克隆引用同一对象。

例如,考虑一个名为 X,反过来,引用对象 A 和 B,引用对象 c。X 的浅表副本创建新的对象 X2 又引用对象 A 和 b。与此相反,X 的深层副本创建新对象 X2,可引用新对象的一个副本 A2 和 B2、 和 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 起可用
返回页首
显示: