C#深拷貝(復制)與淺(復制)


 

簡單來介紹一下C#深淺拷貝問題

淺拷貝:復制其另一個對象的引用(在堆中使用的是同一個對象的引用);

深拷貝:而逐一復制被復制對象的數據成員的方式稱為深復制(在堆中創建新的一塊內存空間,使用的不是同一個對象的引用)

創建一個Person類:

 public class Person
 {
        public int Id { get; set; }    //值類型
        public string Name { get; set; }  //引用類型
        public int Age { get; set; }

 }

 淺拷貝(復制):p2改變,p1也跟着改變,使用的同一個引用對象persion

 class Program
    {
        static void Main(string[] args)
        {
            //初始化一個persion實例
            Person p1 = new Person { Id = 1, Name = "張三", Age = 20 };

            Person p2 = p1; //淺拷貝
            p2.Id = 2;
            p2.Name = "李四";

            Console.WriteLine($"p1的編號{p1.Id},p1的名字{p1.Name}; p2的編號{p2.Id},p2的名字{p2.Name}" );
        }
    }

輸出:

 

 

 

深拷貝(復制):

C#中Object類提供了一個MemberwiseClone方法實現的就是上述機制。

MemberwiseClone(): 創建當前對象的淺拷貝(用來實現淺拷貝的);

實現深拷貝C# 提供一個ICloneable接口,實現Clone方法來實現深拷貝

public class Person:ICloneable
{
        public int Id { get; set; }    //值類型
        public string Name { get; set; }  //引用類型
        public int Age { get; set; }

        public object Clone()
        {
            Person person = (Person)this.MemberwiseClone(); //創建當前對象的淺拷貝。
            return person;
        }
}
class Program
{
        static void Main(string[] args)
        {
            //初始化一個persion實例
            Person p1 = new Person { Id = 1, Name = "張三", Age = 20 };

            Person p2 = p1; //淺拷貝
            p2.Id = 2;
            p2.Name = "李四";

            Person p3 = (Person)p1.Clone(); //深拷貝
            p3.Id = 3;
            p3.Name = "王五";

            Console.WriteLine($"p1的編號{p1.Id},p1的名字{p1.Name}; p2的編號{p2.Id},p2的名字{p2.Name};  p3的編號{p3.Id},p3的名字{p3.Name}" );
        }
}

輸出:

 

實現深拷貝的方式還有以下幾種:

1.創建一個新的對象,把屬性值賦值給新對象的屬性值,例如再添加一個Student的類,同時創建Persion實例和Student實例,把presion的name屬性賦值給student的name,再改變student的name值(和上面方法的原理是一樣的:都是兩個實例);

2.反射

3.表達式目錄樹

4.序列化

就到這里,其他幾種我就不再實現,有時間再一一實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM