当前位置:首页C# > 正文

C# 浅克隆与深克隆

作者:野牛程序员:2023-12-25 13:21:08C#阅读 2379

浅克隆是指创建一个新对象,该对象的值与原始对象相同,但是对象内部的引用类型字段仍然指向原始对象相应字段所引用的对象。这意味着对于引用类型字段而言,浅克隆的新对象和原始对象共享相同的引用。

深克隆是指创建一个新对象,该对象的值与原始对象相同,并且对象内部的引用类型字段也被递归地复制,而不是共享引用。这确保了新对象与原始对象的完全独立性。

在C#中,实现浅克隆可以使用MemberwiseClone方法,该方法创建一个新对象,并将原始对象的字段值复制到新对象中。但需要注意,对于引用类型字段,这仍然是浅复制。

深克隆的实现通常需要自定义,可以通过使用序列化和反序列化、递归复制等方式来确保对象及其内部引用类型字段的完全复制。

以下是一个简单的示例,演示如何在C#中实现浅克隆和深克隆:

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

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

    public Person ShallowClone()
    {
        return (Person)this.MemberwiseClone();
    }

    public Person DeepClone()
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            IFormatter formatter = new BinaryFormatter();
            formatter.Serialize(memoryStream, this);
            memoryStream.Seek(0, SeekOrigin.Begin);
            return (Person)formatter.Deserialize(memoryStream);
        }
    }
}

[Serializable]
class Address
{
    public string City { get; set; }
}

class Program
{
    static void Main()
    {
        Person originalPerson = new Person
        {
            Name = "John Doe",
            Address = new Address { City = "New York" }
        };

        // 浅克隆
        Person shallowClone = originalPerson.ShallowClone();

        // 深克隆
        Person deepClone = originalPerson.DeepClone();

        // 修改原始对象的引用类型字段
        originalPerson.Address.City = "San Francisco";

        // 输出结果
        Console.WriteLine("Original Person:");
        Console.WriteLine($"Name: {originalPerson.Name}, City: {originalPerson.Address.City}");
        Console.WriteLine("Shallow Clone:");
        Console.WriteLine($"Name: {shallowClone.Name}, City: {shallowClone.Address.City}");
        Console.WriteLine("Deep Clone:");
        Console.WriteLine($"Name: {deepClone.Name}, City: {deepClone.Address.City}");
    }
}

请注意,上述代码中的PersonAddress类都标记为Serializable,以便进行序列化和反序列化。此外,深克隆使用了二进制序列化,但也可以使用其他方式,如手动递归复制。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击