C#实例复制和深度复制的实现
2017-07-20 16:38
309 查看
深度复制与浅表复制的区别在于,浅表复制只复制值类型的值,而对于实例所包含的对象依然指向原有实例。
浅复制:MemberwiseClone()
深复制:反射、序列化、树
实例:浅复制MemberwiseClone()、深复制序列化
class Program
{
[Serializable]
public class Car
{
public string name;
public Car(string name)
{
this.name = name;
}
}
[Serializable]
public class Person:ICloneable
{
public int id;
public string name;
public Car car;
public Person()
{
}
public Person(int id, string name, Car car)
{
this.id = id;
this.name = name;
this.car = car;
}
public Object Clone() //实现ICloneable接口,达到浅表复制。浅表复制与深度复制无直接有关系。 对外提供一个创建自身的浅表副本的能力
{
return this.MemberwiseClone();
}
}
//要复制的实例必须可序列化,包括实例引用的其它实例都必须在类定义时加[Serializable]特性。
public static T Copy<T>(T RealObject)
{
using (Stream objectStream = new MemoryStream())
{
//利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, RealObject);
objectStream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(objectStream);
}
}
static void Main(string[] args)
{
Person p1 = new Person(1, "Scott", new Car("宝马"));
Console.WriteLine("原始值:P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);
Person p2 = Copy<Person>(p1); //深复制
Person p3 = p1.Clone() as Person;//浅表复制
Console.WriteLine("改变P1的值");
p1.id = 2;
p1.name = "Lacy";
p1.car.name = "红旗";
Console.WriteLine("P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);
Console.WriteLine("深度复制:P2:id={0}----------->name={1}------>car={2}", p2.id, p2.name, p2.car.name);
Console.WriteLine("浅表复制:P3:id={0}----------->name={1}------>car={2}", p3.id, p3.name, p3.car.name);
Console.ReadKey();
}
效果:
例如:深度复制
List<Person> ListP=new List<Person>();
ListP.Add(new Person(1,"Scott",new Car("宝马")));
ListP.Add(new Person(2,"Lacy",new Car("红旗")));
List<Person> ListP2=Copy<List<Person>>(ListP);
推荐阅读:构建可克隆的对象(icloneable 浅复制)
文章来源:http://blog.csdn.net/flyingdream123/article/details/9294973
浅复制:MemberwiseClone()
深复制:反射、序列化、树
实例:浅复制MemberwiseClone()、深复制序列化
class Program
{
[Serializable]
public class Car
{
public string name;
public Car(string name)
{
this.name = name;
}
}
[Serializable]
public class Person:ICloneable
{
public int id;
public string name;
public Car car;
public Person()
{
}
public Person(int id, string name, Car car)
{
this.id = id;
this.name = name;
this.car = car;
}
public Object Clone() //实现ICloneable接口,达到浅表复制。浅表复制与深度复制无直接有关系。 对外提供一个创建自身的浅表副本的能力
{
return this.MemberwiseClone();
}
}
//要复制的实例必须可序列化,包括实例引用的其它实例都必须在类定义时加[Serializable]特性。
public static T Copy<T>(T RealObject)
{
using (Stream objectStream = new MemoryStream())
{
//利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, RealObject);
objectStream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(objectStream);
}
}
static void Main(string[] args)
{
Person p1 = new Person(1, "Scott", new Car("宝马"));
Console.WriteLine("原始值:P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);
Person p2 = Copy<Person>(p1); //深复制
Person p3 = p1.Clone() as Person;//浅表复制
Console.WriteLine("改变P1的值");
p1.id = 2;
p1.name = "Lacy";
p1.car.name = "红旗";
Console.WriteLine("P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);
Console.WriteLine("深度复制:P2:id={0}----------->name={1}------>car={2}", p2.id, p2.name, p2.car.name);
Console.WriteLine("浅表复制:P3:id={0}----------->name={1}------>car={2}", p3.id, p3.name, p3.car.name);
Console.ReadKey();
}
效果:
例如:深度复制
List<Person> ListP=new List<Person>();
ListP.Add(new Person(1,"Scott",new Car("宝马")));
ListP.Add(new Person(2,"Lacy",new Car("红旗")));
List<Person> ListP2=Copy<List<Person>>(ListP);
推荐阅读:构建可克隆的对象(icloneable 浅复制)
文章来源:http://blog.csdn.net/flyingdream123/article/details/9294973
相关文章推荐
- C#实例复制和深度复制的实现
- C#实例复制和深度复制的实现
- C# 使用反射来实现对象的深度复制方法
- C#实现的文件操作封装类完整实例【删除,移动,复制,重命名】
- C#实例复制和深度复制
- C#复制和深度复制的实现方法
- C#复制和深度复制的实现方法
- C# 使用反射来实现对象的深度复制
- C#采用Remoting实现跨进程调用之代码实例
- C# 撒列实现关键字过滤的实例
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- C# 实现抓取网站页面内容的实例方法
- c#通过反射查找接口的实现 并创造实例
- C#实现简单的JSON序列化功能代码实例
- C#实现用于操作wav声音文件的类实例
- JavaScript深度复制(deep clone)的实现方法
- c#文件的复制,移动,创建(实例代码)
- 利用C#线程机制实现应用程序的单实例运行
- C#实现让程序只能打开一个实例(总结3方法)(转)
- 使用C#实现只允许运行一个程序实例的几种方法