温馨提示×

clone c#浅拷贝与深拷贝的区别

c#
小樊
81
2024-09-28 04:50:58
栏目: 编程语言

在C#中,浅拷贝和深拷贝的主要区别在于它们处理对象内部成员的方式。

  1. 浅拷贝(Shallow Copy):创建一个新对象,然后将原始对象的属性值逐一复制到新对象中。如果属性值是基本数据类型(如int、float、double等),则直接复制其值;如果属性值是引用类型(如数组、集合、自定义类等),则复制的是引用,而不是实际的对象。这意味着,如果原始对象的引用类型属性发生了变化,那么浅拷贝后的对象也会受到影响。

示例:

public class ShallowCopyExample
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<string> Tags { get; set; }
}

// 浅拷贝
var original = new ShallowCopyExample { Id = 1, Name = "Original", Tags = new List<string> { "Tag1", "Tag2" } };
var copy = new ShallowCopyExample { Id = original.Id, Name = original.Name, Tags = original.Tags };
  1. 深拷贝(Deep Copy):创建一个新对象,并递归地将原始对象的所有属性值复制到新对象中。对于引用类型属性,深拷贝会创建一个新的对象,并将原始对象的属性值复制到新对象中。这意味着,即使原始对象的引用类型属性发生了变化,深拷贝后的对象也不会受到影响。

示例:

public class DeepCopyExample
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<string> Tags { get; set; }
}

// 深拷贝
var original = new DeepCopyExample { Id = 1, Name = "Original", Tags = new List<string> { "Tag1", "Tag2" } };
var copy = new DeepCopyExample { Id = original.Id, Name = original.Name, Tags = new List<string>(original.Tags) };

总结:浅拷贝只复制对象的第一层属性,而深拷贝会递归地复制对象的所有层次属性。在实际应用中,根据需求选择合适的拷贝方式。如果对象内部没有引用类型的属性,或者不需要完全独立的副本,可以使用浅拷贝。如果对象内部有引用类型的属性,并且需要完全独立的副本,可以使用深拷贝。

0