C# List 复制之深浅拷贝
C# List 复制 之深浅拷贝
声明类
public class TestStu{public int Number{get;set; }public string Name{get;set; }}public static async Task<int> Main(string[] args){var stu1 = new TestStu(){Number = 1,Name = "1"};var stu2= new TestStu(){Number = 2,Name = "2"};var list1 = new List<TestStu> { stu1, stu2};var list2 = new List<TestStu>();list1.ForEach(list2.Add);var list3 = new List<TestStu>();foreach (var item in list){list3.Add(new TestStu(){Number = item.Number,Name = item.Name});}var list4 = DeepCopy(list3);list1.FirstOrDefault().Name = "3";list1.FirstOrDefault().Number = 3;
执行上述方法, 修改list1 中的属性值, 发现list2 的属性值会跟着变化, list3 的属性值不发生变化;
由于进行的是浅拷贝,所以直接将list1的内容复制给了list2,虽然list1和list2所在的地址不一样,但是两个list存储的对象仍然是相同的(因为把list1复制到list2时,浅拷贝复制的是引用地址),导致改变在list1中改变属性时,list2中的属性也会改变;
若想保留一份list1 的原始副本数据, 可以用list3 创建赋值的方式, 但是繁琐, 可以使用深拷贝的方式;
深拷贝方法如下:
//深拷贝方法public static List<T> DeepCopy<T>(this List<T> list){var options = new JsonSerializerOptions{IgnoreReadOnlyProperties = true,IncludeFields = true};var serialized = JsonSerializer.Serialize(list, options);return JsonSerializer.Deserialize<List<T>>(serialized, options);}
//修改list1 的属性, list4 的属性不会发生变化
var list4 = DeepCopy(list3);