MemberwiseClone C#克隆
2012-07-19 15:44
309 查看
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方法。 View Code 1 using System;
2 public class IdInfo
3 {
4 public int IdNumber;
5 public IdInfo(int IdNumber)
6 {
7 this.IdNumber=IdNumber;
8 }
9 }
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(this.IdInfo.IdNumber);
return other;
}
}
public class Example
{
public static void Main(string[] args)
{
Person p1=new Person();
p1.Age=42;
p1.Name="Sam";
p1.IdInfo=new InInfo(6565);
Person p2=(Person)p1.ShallowCopy();
Console.WriteLine("Original values of p1 and p2:");
Console.writeLine(" p1.instance values: ");
Console.writeLine(" p2.instance values: ");
DisplayValues(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);
Person p3=p1.DeepCopy();
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.InInfo.IdNumer);
}
}
// 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
//
调用MemberwiseClone方法创建的对象的浅表副本,然后将指定新的对象,其值均相同,院士对象的任何属性或字段的值是引用类型。该实例中的DeepCopy方法阐释了这种方法。
序列化要深层复制的对象,然后将序列化的数据还原到另一个对象变量。
使用带递归的反射执行的深层复制操作。
下面的实力掩饰MemberwiseClone方法。它定义了ShallowCopy方法,该方法通过调用MemberwiseClone方法来在Person对象上执行浅表复制操作。他还定义了在Person对象上执行深层复制操作的DeepCopy方法。 View Code 1 using System;
2 public class IdInfo
3 {
4 public int IdNumber;
5 public IdInfo(int IdNumber)
6 {
7 this.IdNumber=IdNumber;
8 }
9 }
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(this.IdInfo.IdNumber);
return other;
}
}
public class Example
{
public static void Main(string[] args)
{
Person p1=new Person();
p1.Age=42;
p1.Name="Sam";
p1.IdInfo=new InInfo(6565);
Person p2=(Person)p1.ShallowCopy();
Console.WriteLine("Original values of p1 and p2:");
Console.writeLine(" p1.instance values: ");
Console.writeLine(" p2.instance values: ");
DisplayValues(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);
Person p3=p1.DeepCopy();
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.InInfo.IdNumer);
}
}
// 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
//
相关文章推荐
- C#中MemberwiseClone的理解
- C# Object.MemberwiseClone 方法
- Git操作指南(2) —— Git Gui for Windows的建库、克隆(clone)、上传(push)、下载(pull)、合并
- 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复
- C#中的深复制和浅复制(在C#中克隆对象)
- php类和对象: clone 克隆
- 【PHP面向对象(OOP)编程入门教程】17.克隆对象__clone()方法
- 【CDP-云设计模式】第4章,2.克隆服务器模式(Clone Server Pattern)
- Java克隆(Clone)的应用
- java克隆对象clone()的使用方法和作用
- (2.1.9)java的clone和浅复制克隆、深复制克隆
- Java克隆(Clone)的应用
- Git操作指南(2) —— Git Gui for Windows的建库、克隆(clone)、上传(push)、下载(pull)、合并
- Java中的克隆clone以及对数组的复制
- java數組克隆(clone)的意義
- 对象的克隆clone
- MemberwiseClone 的用法(浅copy)
- JQuery DOM clone(true),对于克隆对象事件触发后,处理函数中this指代克隆对象
- php类和对象: clone 克隆