C#深度克隆与浅克隆
2016-03-11 10:31
585 查看
克隆是创建作为当前实例副本的新对象。
克隆分为深度克隆和浅度克隆
深度克隆:会克隆当前实例的所有所有成员.
浅度克隆:只会克隆当前实例的所有值类型的.
浅度克隆Object类为我们提供了一个受保护的克隆方法MemberwiseClone()
深度克隆要我们自己实现
我们先来创建两个类:
[Serializable]//这个标记是表示可以序列化这个类
//Address类 有2个属性 Province 和City
public class Address
{
private string _city;
public string City
{
get { return _city; }
set { _city = value; }
}
private string _province;
public string Province
{
get { return _province; }
set { _province = value; }
}
}
//Person 类有3个属性 Name 、Age、Address
[Serializable]
public class Person
{
private string _name;
private int _age;
private Address _address;
public Person(string name,int age,Address address)
{
_name = name;
_age = age;
_address = address;
}
}
public Person Clone()
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, this);
ms.Seek(0, SeekOrigin.Begin);
return (Person)bf.Deserialize(ms);
}
public Person Clone()
{
Person temp = new Person();
temp.Name = this.Name;
temp.Age = this.Age;
temp.Address.Province = this.Address.Province;
temp.Address.City = this.Address.City;
return temp;
}
方法一的优点是克隆方便,但是需要把对象标记为可序列化。
方法二的优点是可以克隆任意类型的对象,但是费时费力,而且容易出错
综合来看,方法一是值得推荐的选择。
下面来说浅克隆,浅克隆就比较简单了,直接用MemberwiseClone就可以实现
MemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
关于MemberwiseClone的使用方法,请参考MSDN。
克隆分为深度克隆和浅度克隆
深度克隆:会克隆当前实例的所有所有成员.
浅度克隆:只会克隆当前实例的所有值类型的.
浅度克隆Object类为我们提供了一个受保护的克隆方法MemberwiseClone()
深度克隆要我们自己实现
我们先来创建两个类:
[Serializable]//这个标记是表示可以序列化这个类
//Address类 有2个属性 Province 和City
public class Address
{
private string _city;
public string City
{
get { return _city; }
set { _city = value; }
}
private string _province;
public string Province
{
get { return _province; }
set { _province = value; }
}
}
//Person 类有3个属性 Name 、Age、Address
[Serializable]
public class Person
{
private string _name;
private int _age;
private Address _address;
public Person(string name,int age,Address address)
{
_name = name;
_age = age;
_address = address;
}
}
public Person Clone()
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, this);
ms.Seek(0, SeekOrigin.Begin);
return (Person)bf.Deserialize(ms);
}
public Person Clone()
{
Person temp = new Person();
temp.Name = this.Name;
temp.Age = this.Age;
temp.Address.Province = this.Address.Province;
temp.Address.City = this.Address.City;
return temp;
}
方法一的优点是克隆方便,但是需要把对象标记为可序列化。
方法二的优点是可以克隆任意类型的对象,但是费时费力,而且容易出错
综合来看,方法一是值得推荐的选择。
下面来说浅克隆,浅克隆就比较简单了,直接用MemberwiseClone就可以实现
MemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。
关于MemberwiseClone的使用方法,请参考MSDN。
相关文章推荐
- C# 如何获取配置文件里的节点信息
- 浅谈C# 多态的魅力(虚方法,抽象,接口实现)
- 解析C#中[],List,Array,ArrayList的区别及应用
- C# Enum,Int,String的互相转换 枚举转换
- C#中的流程控制语句
- 【C#进阶系列】08 关于参数的故事
- C#内存堆栈管理
- 解决CSharp 序列化时未能找到类型System.String上的构造函数
- C#-Control.Invoke与Control.BeginInvoke
- 【混合编程】C#调用C++
- C#导出涉及行列合并的复杂的Excel数据
- C#基础之接口
- CIL----公共中间语言
- C#利用反射获取对象属性值
- C# 使用微软的Visual Studio International Pack 类库提取汉字拼音首字母
- C#日期格式化,时间
- c#之程序集的理解
- 认识.NET平台
- 值类型和引用类型
- c#事务处理(Transaction)