[C#]淺複製和深複製的區別和在C#中的體現形式

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   art   ar   div   

 

前言:我們知道對象分參考型別和實值型別。

淺複製:複製一個現有對象,參考型別指向同一個記憶體塊(string為最特殊的對象,這裡當作實值型別來看先)

public class User      {        public int Age { get; set; }        public string UserName { get; set; }        public List<string> List { get; set; }        public User ShallowCopy()        {            return this.MemberwiseClone() as User;        }    }  class Program    {        static void Main(string[] args)        {            var user = new User();            user.List = new List<string>();            user.Age = 1;            user.UserName = "lisi";            user.List.Add("lst1");                var cloneUser = user.ShallowCopy();            Console.WriteLine(user.List.Count());            Console.WriteLine(cloneUser.UserName);            Console.WriteLine(user.Age);            cloneUser.Age = 2;            cloneUser.UserName = "zhangsan";            cloneUser.List.Add("lst2");            Console.WriteLine(user.List.Count());            Console.WriteLine(cloneUser.UserName);            Console.WriteLine(user.Age);            Console.ReadKey();        }    }
Shallow Copy Code

 輸出值分別為:

  1(user.List.Count(),這個說參考型別,我們看下面的輸出)

  lisi

  1

 

  2(這裡我們在複製以後,有添加一個值,我們說了他們指向同一個記憶體塊,所以這裡是2)

  zhangsan

  1

 

補充:

一個對象中的欄位有的是實值型別的,有的是參考型別的。對於實值型別欄位來說,它的值就是簡單的值,而對於參考型別來說,它的值是地址。

淺複製在複製時,將這個對象的值欄位和引用欄位(均為非靜態欄位)全部複製過去,獲得了這個對象的值和地址。

即:當其中一個對象的引用欄位所指向的地址中的變數變化時,所有淺複製對象中的該引用欄位都會發生變化。

深複製:複製一個現有對象,參考型別指向另一個記憶體塊(改變複製對象的任何一個值都不會影響其他值)

 

 public class User    {        public int Age { get; set; }        public string UserName { get; set; }        public List<string> List { get; set; }        public User Clone()        {            return new User()             {                 Age = this.Age,                 UserName = this.UserName,                 List = new List<string>() { this.List[0] }             };        }    } class Program    {        static void Main(string[] args)        {            var user = new User();            user.List = new List<string>();            user.Age = 1;            user.UserName = "lisi";            user.List.Add("lst1");            var cloneUser = user.Clone();            cloneUser.Age = 2;            cloneUser.UserName = "zhangsan";            cloneUser.List[0] = "updatedlist";            Console.WriteLine(user.List[0]);            Console.WriteLine(user.UserName);            Console.WriteLine(user.Age);            Console.ReadKey();        }    }
View Code

 輸出值為:

  lst1

  lisi

  1

 

註:

所有參考型別都是深複製

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.