標籤: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
註:
所有參考型別都是深複製