OneBigLoser
OneBigLoser
发布于 2024-07-08 / 23 阅读
0
0

浅拷贝和深拷贝

浅拷贝和深拷贝是两个在编程中非常重要的概念,尤其当你处理对象和数据结构时。这两个术语描述了如何复制对象的数据。为了更好地理解这些概念,我们可以用一个简单的日常生活例子来形象化解释。

浅拷贝(Shallow Copy)

概念: 浅拷贝是创建一个新对象,这个新对象是原始对象的一个副本,但它仅复制原始对象的引用。这意味着,如果原始对象中有其他对象,它们在浅拷贝中只是被引用,而不是被复制。

形象化解释: 想象一下,你有一张包含多个照片的相册。你想要给朋友一份相册的副本,但你只是复印了相册的目录页,而没有复印每张照片。现在,你和你的朋友都有一个相册目录,但你们仍然共享同样的照片。如果你修改其中一张照片,你朋友看到的照片也会被修改,因为你们共享的仍然是同一张照片。

代码示例

using System;
using System.Collections.Generic;

class Program
{
    class Person
    {
        public string Name { get; set; }
        public List<string> Hobbies { get; set; }
    }

    static void Main()
    {
        var person1 = new Person
        {
            Name = "Alice",
            Hobbies = new List<string> { "Reading", "Swimming" }
        };

        // 浅拷贝
        var person2 = (Person)person1.MemberwiseClone();

        // 修改person2的Hobbies
        person2.Hobbies[0] = "Writing";

        Console.WriteLine(person1.Hobbies[0]); // 输出: Writing
        Console.WriteLine(person2.Hobbies[0]); // 输出: Writing
    }
}

在这个例子中,person1person2共享同一个Hobbies列表。修改person2的爱好会影响person1,因为它们引用的是同一个列表对象。

深拷贝(Deep Copy)

概念: 深拷贝是创建一个新对象,这个新对象不仅仅是原始对象的副本,而且还递归地复制了原始对象所包含的所有对象。这意味着,新对象和原始对象是完全独立的,它们的任何改变不会互相影响。

形象化解释: 继续相册的例子。这次,你不仅复印了相册的目录页,还复印了每一张照片。现在,你和你的朋友都有各自独立的相册。你修改自己的某张照片,并不会影响到你朋友的那张照片,因为你们的照片是各自独立的。

代码示例

using System;
using System.Collections.Generic;

class Program
{
    class Person
    {
        public string Name { get; set; }
        public List<string> Hobbies { get; set; }

        public Person DeepCopy()
        {
            var newPerson = (Person)this.MemberwiseClone();
            newPerson.Hobbies = new List<string>(this.Hobbies);
            return newPerson;
        }
    }

    static void Main()
    {
        var person1 = new Person
        {
            Name = "Alice",
            Hobbies = new List<string> { "Reading", "Swimming" }
        };

        // 深拷贝
        var person2 = person1.DeepCopy();

        // 修改person2的Hobbies
        person2.Hobbies[0] = "Writing";

        Console.WriteLine(person1.Hobbies[0]); // 输出: Reading
        Console.WriteLine(person2.Hobbies[0]); // 输出: Writing
    }
}

在这个例子中,person1person2有各自独立的Hobbies列表。修改person2的爱好不会影响person1,因为它们的列表是独立的。

总结

  • 浅拷贝:仅复制对象的引用,修改副本会影响原始对象。

  • 深拷贝:复制对象及其包含的所有对象,修改副本不会影响原始对象。


评论