关于C#的深拷贝

时间:2021-05-20 19:53:18

简单点说:1.浅拷贝:就是把一个类型的所有字段的值都赋值一遍·值类型和引用类型的值都拷贝一份,引用类型的值为原对象引用所指向的地址,所以修改会把原来对象的引用指向值所改变。(string是特殊的类·当作值类型来使用 就是非引用类型)

2.深拷贝:就是把引用类型所指向的类容也一起拷贝一份,修改起指向不会更改原来引用指向的值。

 

这里就来说说深拷贝的实现方式:

第一种就是序列化方法:可以继承ICloneable实现其接口Clone

[Serializable]//如果不把CardData加上序列化标识则无法序列化

public class CardData : ICardData , ICloneable
{

/// <summary>
/// 深拷贝
/// </summary>
/// <returns></returns>
public object Clone()
{
using(Stream objectStream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, this);
objectStream.Seek(0, SeekOrigin.Begin);
return formatter.Deserialize(objectStream) as CardData;
}
}

 

还有一种办法就写一个新的构造函数

public CardData(ICardData card)
{

//依次赋值所有字段如果 字段很多的话就非常蛋疼

}