首页 > 代码库 > [C#]浅克隆和深克隆的区别和在C#中的体现形式
[C#]浅克隆和深克隆的区别和在C#中的体现形式
前言:我们知道对象分引用类型和值类型。
浅克隆:复制一个现有对象,引用类型指向同一个内存块(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(); } }
输出值分别为:
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(); } }
输出值为:
lst1
lisi
1
注:
所有引用类型都是深克隆
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。