.NET Framework类库MemberwiseClone 方法

.NET Framework 类库
Object MemberwiseClone 方法

更新:2010 年 9 月

创建当前 Object的浅表副本。

命名空间:   System
程序集:   mscorlib(在 mscorlib.dll 中)
语法
Protected Function MemberwiseClone As Object

       
       
  1. protected Object MemberwiseClone()
protected:
Object^ MemberwiseClone()
member MemberwiseClone : unit -> Object 
返回值
类型: SystemObject
当前 Object的浅表副本。
备注

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

例如,考虑引用对象 A 和 B 的被称为 X 的对象。 对象 B 依次引用对象 C。X 的浅表副本创建一个新对象 X2,该对象也引用对象 A 和 B。 相比而言,X 的深层副本创建一个新对象 X2,该对象引用新对象 A2 和 B2(分别为 A 和 B 的副本)。B2 又引用新对象 C2,C2 是 C 的副本。 该示例阐释了浅层和深层复制操作之间的区别。

有很多方法可以实现深层复制操作,前提是浅表复制操作由 MemberwiseClone 方法执行但不符合您的需求。这些要求包括:

  • 调用要复制的对象的类构造函数以创建含有从第一个对象中提出的属性值的第二个对象。 这假定对象的值完全由类构造函数定义。

  • 调用 MemberwiseClone 方法创建的对象的浅表副本,然后将指定新的对象,其值均相同,原始对象的任何属性或字段的值是引用类型。该示例中的 DeepCopy 方法阐释了这种方法。

  • 序列化要深层复制的对象,然后将序列化的数据还原到另一个对象变量。

  • 使用带递归的反射执行的深层复制操作。

示例

下面的示例演示 MemberwiseClone 方法。它定义了 ShallowCopy 方法,该方法通过调用 MemberwiseClone 方法来在 Person 对象上执行浅表复制操作。它还定义了在 Person 对象上执行深层复制操作的 DeepCopy 方法。


Public Class IdInfo
    Public IdNumber As Integer

    Public Sub New(IdNumber As Integer)
        Me.IdNumber = IdNumber
    End Sub
End Class

Public Class Person 
    Public Age As Integer
    Public Name As String
    Public IdInfo As IdInfo

    Public Function ShallowCopy() As Person
       Return DirectCast(Me.MemberwiseClone(), Person)
    End Function

    Public Function DeepCopy() As Person
       Dim other As Person = DirectCast(Me.MemberwiseClone(), Person) 
       other.IdInfo = New IdInfo(Me.IdInfo.IdNumber)
       Return other
    End Function
End Class

Module Example
   Public Sub Main()
        ' Create an instance of Person and assign values to its fields.
        Dim p1 As New Person()
        p1.Age = 42
        p1.Name = "Sam"
        p1.IdInfo = New IdInfo(6565)

        ' Perform a shallow copy of p1 and assign it to p2.
        Dim p2 As Person = DirectCast(p1.ShallowCopy(), Person)

        ' 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)
        Console.WriteLine()

        ' 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("Values of p1 and p2 after changes to p1:")
        Console.WriteLine("   p1 instance values: ")
        DisplayValues(p1)
        Console.WriteLine("   p2 instance values:")
        DisplayValues(p2)
        Console.WriteLine()

        ' Make a deep copy of p1 and assign it to p3.
        Dim p3 As Person = 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("Values of p1 and p3 after changes to p1:")
        Console.WriteLine("   p1 instance values: ")
        DisplayValues(p1)
        Console.WriteLine("   p3 instance values:")
        DisplayValues(p3)
   End Sub

    Public Sub DisplayValues(p As Person)
        Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age)
        Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber)
    End Sub
End Module
' The example displays the following output:
'       Original values of m1 and m2:
'          m1 instance values:
'             Name: Sam, Age: 42
'             Value: 6565
'          m2 instance values:
'             Name: Sam, Age: 42
'             Value: 6565
'       
'       Values of m1 and m2 after changes to m1:
'          m1 instance values:
'             Name: Frank, Age: 32
'             Value: 7878
'          m2 instance values:
'             Name: Sam, Age: 42
'             Value: 7878
'       
'       Values of m1 and m3 after changes to m1:
'          m1 instance values:
'             Name: George, Age: 39
'             Value: 8641
'          m3 instance values:
'             Name: Frank, Age: 32
'             Value: 7878


        
        
  1. using System;
  2.  
  3. public class IdInfo
  4. {
  5.     public int IdNumber;
  6.  
  7.     public IdInfo(int IdNumber)
  8.     {
  9.         this.IdNumber = IdNumber;
  10.     }
  11. }
  12.  
  13. public class Person 
  14. {
  15.     public int Age;
  16.     public string Name;
  17.     public IdInfo IdInfo;
  18.  
  19.     public Person ShallowCopy()
  20.     {
  21.        return (Person)this.MemberwiseClone();
  22.     }
  23.  
  24.     public Person DeepCopy()
  25.     {
  26.        Person other = (Person) this.MemberwiseClone(); 
  27.        other.IdInfo = new IdInfo(this.IdInfo.IdNumber);
  28.        return other;
  29.     }
  30. }
  31.  
  32. public class Example
  33. {
  34.     public static void Main()
  35.     {
  36.         // Create an instance of Person and assign values to its fields.
  37.         Person p1 = new Person();
  38.         p1.Age = 42;
  39.         p1.Name = "Sam";
  40.         p1.IdInfo = new IdInfo(6565);
  41.  
  42.         // Perform a shallow copy of p1 and assign it to p2.
  43.         Person p2 = (Person) p1.ShallowCopy();
  44.  
  45.         // Display values of p1, p2
  46.         Console.WriteLine("Original values of p1 and p2:");
  47.         Console.WriteLine("   p1 instance values: ");
  48.         DisplayValues(p1);
  49.         Console.WriteLine("   p2 instance values:");
  50.         DisplayValues(p2);
  51.  
  52.         // Change the value of p1 properties and display the values of p1 and p2.
  53.         p1.Age = 32;
  54.         p1.Name = "Frank";
  55.         p1.IdInfo.IdNumber = 7878;
  56.         Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
  57.         Console.WriteLine("   p1 instance values: ");
  58.         DisplayValues(p1);
  59.         Console.WriteLine("   p2 instance values:");
  60.         DisplayValues(p2);
  61.  
  62.         // Make a deep copy of p1 and assign it to p3.
  63.         Person p3 = p1.DeepCopy();
  64.         // Change the members of the p1 class to new values to show the deep copy.
  65.         p1.Name = "George";
  66.         p1.Age = 39;
  67.         p1.IdInfo.IdNumber = 8641;
  68.         Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
  69.         Console.WriteLine("   p1 instance values: ");
  70.         DisplayValues(p1);
  71.         Console.WriteLine("   p3 instance values:");
  72.         DisplayValues(p3);
  73.     }
  74.  
  75.     public static void DisplayValues(Person p)
  76.     {
  77.         Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age);
  78.         Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber);
  79.     }
  80. }
  81. // The example displays the following output:
  82. //       Original values of p1 and p2:
  83. //          p1 instance values:
  84. //             Name: Sam, Age: 42
  85. //             Value: 6565
  86. //          p2 instance values:
  87. //             Name: Sam, Age: 42
  88. //             Value: 6565
  89. //       
  90. //       Values of p1 and p2 after changes to p1:
  91. //          p1 instance values:
  92. //             Name: Frank, Age: 32
  93. //             Value: 7878
  94. //          p2 instance values:
  95. //             Name: Sam, Age: 42
  96. //             Value: 7878
  97. //       
  98. //       Values of p1 and p3 after changes to p1:
  99. //          p1 instance values:
  100. //             Name: George, Age: 39
  101. //             Value: 8641
  102. //          p3 instance values:
  103. //             Name: Frank, Age: 32
  104. //             Value: 7878
  105.  

在此示例中,Person.IdInfo 属性返回 IdInfo 对象。 如示例输出所示,调用 MemberwiseClone 方法克隆Person 对象时,克隆的 Person 对象是原始对象的独立副本,但它们共享相同的Person.IdInfo 对象引用。 其结果是,修改克隆的 Person.IdInfo 属性将更改原始对象的 Person.IdInfo 属性。 另一方面,执行深层复制操作时,克隆出来的 Person 对象,包括其 Person.IdInfo 属性,都可以修改,而且不会影响原始对象。

版本信息
.NET Framework
受以下版本支持:4.5、4、3.5、3.0、2.0、1.1、1.0
.NET Framework Client Profile
受以下版本支持:4、3.5 SP1
可移植类库
受以下版本支持:可移植类库
平台

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(不支持服务器核心角色), Windows Server 2008 R2(支持带 SP1 或更高版本的服务器核心角色;不支持 Itanium)

.NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见 .NET Framework 系统要求
修订记录

日期

修订记录

原因

2010 年 9 月

修订“备注”部分,并替换该示例。

客户反馈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值