什么是浅复制以及它与 C# 中的深复制有何不同?

1. 什么是浅复制?

浅复制是一种复制对象的方法,它只复制了对象的表面结构,而没有复制对象的内容。具体来说,浅复制只复制了对象的值类型字段和引用类型字段的引用,而没有复制引用类型字段指向的对象。

浅复制通常使用对象的 Clone 方法实现。在 C# 中,所有的类都继承自 Object 类,Object 类中定义了一个虚拟方法 Clone,因此所有的类都可以覆盖该方法来实现浅复制。

public class Person : ICloneable

{

public string Name;

public int Age;

public Address Address;

public object Clone()

{

return this.MemberwiseClone();

}

}

public class Address

{

public string City;

public string Street;

}

var person1 = new Person

{

Name = "John",

Age = 30,

Address = new Address { City = "New York", Street = "Broadway" }

};

var person2 = (Person)person1.Clone(); // 浅复制

Console.WriteLine(person1.Address == person2.Address); // true

上述代码中,Person 类有一个引用类型字段 Address。当进行浅复制之后,person1 和 person2 都指向同一个 Address 对象,因此 person1.Address 和 person2.Address 的地址相同。

浅复制示意图

2. 深复制与浅复制的区别

与浅复制不同,深复制会创建一个新的对象,并且将原对象中的所有内容都复制到新对象中,包括引用类型字段指向的对象。

public class Address

{

public string City;

public string Street;

public Address Clone()

{

return new Address { City = this.City, Street = this.Street };

}

}

public class Person : ICloneable

{

public string Name;

public int Age;

public Address Address;

public object Clone()

{

return new Person

{

Name = this.Name,

Age = this.Age,

Address = this.Address?.Clone()

};

}

}

var person1 = new Person

{

Name = "John",

Age = 30,

Address = new Address { City = "New York", Street = "Broadway" }

};

var person2 = (Person)person1.Clone(); // 深复制

Console.WriteLine(person1.Address == person2.Address); // false

上述代码中,Address 类和 Person 类都实现了 Clone 方法,其中 Address 类的 Clone 方法返回新的 Address 对象,而 Person 类的 Clone 方法返回新的 Person 对象,并且将 Address 对象也进行了深复制。当进行深复制之后,person1.Address 和 person2.Address 的地址不同,说明它们指向不同的 Address 对象。

深复制示意图

3. 深复制与浅复制的比较

浅复制和深复制都是复制对象的方法,它们的主要区别在于复制的范围。具体来说,浅复制只复制对象的表面结构,而深复制则复制对象的所有内容。

浅复制适用于对象的值类型字段比较多,而对象的引用类型字段比较少的情况,因为这种情况下对象的内容比较简单、复制的对象比较少,使用浅复制能够避免创建大量不必要的对象。

深复制适用于对象的引用类型字段比较多的情况,因为这种情况下对象的内容比较复杂、复制的对象比较多,如果使用浅复制,则很容易出现对象引用的问题。

在实际编程中,在进行浅复制或深复制时,需要根据具体情况决定使用哪种方式。

4. 总结

浅复制和深复制都是复制对象的方法,它们的主要区别在于复制的范围。浅复制只复制对象的表面结构,而深复制会复制对象的所有内容。在实际编程中,需要根据具体情况决定使用哪种方式,以达到最优的复制效果。

后端开发标签