在C#中,浅拷贝和深拷贝的主要区别在于它们处理对象内部成员的方式。
- 浅拷贝(Shallow Copy):创建一个新对象,然后将原始对象的属性值逐一复制到新对象中。如果属性值是基本数据类型(如int、float、double等),则直接复制其值;如果属性值是引用类型(如数组、集合、自定义类等),则复制的是引用,而不是实际的对象。这意味着,如果原始对象的引用类型属性发生了变化,那么浅拷贝后的对象也会受到影响。
示例:
public class ShallowCopyExample { public int Id { get; set; } public string Name { get; set; } public ListTags { get; set; } } // 浅拷贝 var original = new ShallowCopyExample { Id = 1, Name = "Original", Tags = new List { "Tag1", "Tag2" } }; var copy = new ShallowCopyExample { Id = original.Id, Name = original.Name, Tags = original.Tags };
- 深拷贝(Deep Copy):创建一个新对象,并递归地将原始对象的所有属性值复制到新对象中。对于引用类型属性,深拷贝会创建一个新的对象,并将原始对象的属性值复制到新对象中。这意味着,即使原始对象的引用类型属性发生了变化,深拷贝后的对象也不会受到影响。
示例:
public class DeepCopyExample { public int Id { get; set; } public string Name { get; set; } public ListTags { get; set; } } // 深拷贝 var original = new DeepCopyExample { Id = 1, Name = "Original", Tags = new List { "Tag1", "Tag2" } }; var copy = new DeepCopyExample { Id = original.Id, Name = original.Name, Tags = new List (original.Tags) };
总结:浅拷贝只复制对象的第一层属性,而深拷贝会递归地复制对象的所有层次属性。在实际应用中,根据需求选择合适的拷贝方式。如果对象内部没有引用类型的属性,或者不需要完全独立的副本,可以使用浅拷贝。如果对象内部有引用类型的属性,并且需要完全独立的副本,可以使用深拷贝。