c# 浅拷贝与深拷贝区别

浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是在编程中用于复制对象或数据结构的两种不同方式,它们有着重要的区别:

1. **浅拷贝(Shallow Copy):**

   - 浅拷贝创建一个新的对象或数据结构,但只复制原始对象中的基本数据类型字段的值,而不复制引用类型字段所引用的对象本身。
   - 对于引用类型字段,浅拷贝仅复制引用,因此新对象和原始对象中的引用类型字段将引用相同的对象。
   - 如果对新对象所引用的对象进行修改,原始对象中相应的字段也会受到影响,因为它们引用相同的对象。
   - 浅拷贝一般可以通过对象的成员wiseClone方法来实现,或者通过复制构造函数等方式。

2. **深拷贝(Deep Copy):**

   - 深拷贝创建一个新的对象或数据结构,并且递归地复制原始对象中的所有字段,包括引用类型字段所引用的对象,以便新对象和原始对象之间彼此独立,互不影响。
   - 即使对新对象所引用的对象进行修改,原始对象中相应的字段也不会受到影响,因为它们引用的是不同的对象。
   - 实现深拷贝通常需要自定义代码,因为编程语言通常不会自动提供深拷贝的功能。你需要递归遍历对象的所有属性,并复制它们或创建新对象。

下面是一个示例来说明浅拷贝和深拷贝的区别:

```csharp
class Person
{
    public string Name { get; set; }
    public Address Address { get; set; }
}

class Address
{
    public string Street { get; set; }
    public string City { get; set; }
}

// 浅拷贝示例
Person originalPerson = new Person
{
    Name = "Alice",
    Address = new Address { Street = "123 Main St", City = "City1" }
};

Person shallowCopyPerson = (Person)originalPerson.MemberwiseClone();
shallowCopyPerson.Address.City = "City2";

Console.WriteLine(originalPerson.Address.City); // 输出 "City2",因为浅拷贝共享了同一份Address对象

// 深拷贝示例
Person deepCopyPerson = new Person
{
    Name = originalPerson.Name,
    Address = new Address
    {
        Street = originalPerson.Address.Street,
        City = originalPerson.Address.City
    }
};

deepCopyPerson.Address.City = "City3";

Console.WriteLine(originalPerson.Address.City); // 输出 "City2",因为深拷贝不共享Address对象
```

总之,浅拷贝复制对象的结构,但共享引用,而深拷贝复制对象及其引用的所有对象,使得新对象是完全独立的。深拷贝可能更复杂并且耗费更多资源,但通常在需要完全独立的副本时是必要的。

你可能感兴趣的:(c#)