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