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中的属性也会改变;文章来源:https://www.toymoban.com/news/detail-728831.html
若想保留一份list1 的原始副本数据, 可以用list3 创建赋值的方式, 但是繁琐, 可以使用深拷贝的方式;
深拷贝方法如下:文章来源地址https://www.toymoban.com/news/detail-728831.html
//深拷贝方法
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);
到了这里,关于C# List 复制之深浅拷贝的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!