溫馨提示×

clone c#淺拷貝與深拷貝的區(qū)別

c#
小樊
81
2024-09-28 04:50:58
欄目: 編程語言

在C#中,淺拷貝和深拷貝的主要區(qū)別在于它們處理對象內(nèi)部成員的方式。

  1. 淺拷貝(Shallow Copy):創(chuàng)建一個新對象,然后將原始對象的屬性值逐一復制到新對象中。如果屬性值是基本數(shù)據(jù)類型(如int、float、double等),則直接復制其值;如果屬性值是引用類型(如數(shù)組、集合、自定義類等),則復制的是引用,而不是實際的對象。這意味著,如果原始對象的引用類型屬性發(fā)生了變化,那么淺拷貝后的對象也會受到影響。

示例:

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):創(chuàng)建一個新對象,并遞歸地將原始對象的所有屬性值復制到新對象中。對于引用類型屬性,深拷貝會創(chuàng)建一個新的對象,并將原始對象的屬性值復制到新對象中。這意味著,即使原始對象的引用類型屬性發(fā)生了變化,深拷貝后的對象也不會受到影響。

示例:

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) };

總結:淺拷貝只復制對象的第一層屬性,而深拷貝會遞歸地復制對象的所有層次屬性。在實際應用中,根據(jù)需求選擇合適的拷貝方式。如果對象內(nèi)部沒有引用類型的屬性,或者不需要完全獨立的副本,可以使用淺拷貝。如果對象內(nèi)部有引用類型的屬性,并且需要完全獨立的副本,可以使用深拷貝。

0