C#:.NET深拷贝和浅拷贝

发布时间 2023-03-23 17:19:17作者: 十二年新

.NET中的深拷贝和浅拷贝是指对象复制的方式。浅拷贝只复制对象的引用,而不复制对象本身,因此两个对象会共享同一个引用。深拷贝则是复制对象本身,而不是复制对象的引用,因此两个对象是完全独立的。

在.NET中,可以通过实现ICloneable接口来实现对象的浅拷贝。

ICloneable接口定义了一个Clone方法,该方法返回一个与当前对象相同的新对象。默认情况下,Clone方法执行的是浅拷贝。 

如果需要实现对象的深拷贝,可以使用序列化和反序列化的方式。例如,可以使用BinaryFormatter类将对象序列化为二进制数据,然后再使用MemoryStream和BinaryFormatter类将二进制数据反序列化为新的对象。这样可以实现对象的深拷贝。 

以下是一个示例代码,演示了如何使用序列化和反序列化的方式实现对象的深拷贝: 

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

class Program
{
    static void Main(string[] args)
    {
        Person person1 = new Person { Name = "张三", Age = 18 };
        Person person2 = DeepClone(person1);
        Console.WriteLine(person1 == person2); // 输出 False
    }

    static T DeepClone<T>(T obj)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, obj);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
}

[Serializable]
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}