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);
相关推荐
samble6 小时前
从零搭建灌装监控系统(十八):自定义控件,三色灯与状态指示
c#·wpf·mvvm·modbus·工业控制
jun_bai6 小时前
使用Aspose实现word文档合并,内容替换
windows·c#·word
字节暗面10 小时前
客户端上报不可信:游戏服务端数据校验与对局重演设计
c#·游戏开发·服务端校验·反作弊
chingho10 小时前
GitHub上这10个C#项目,不仅实用,还怪好玩的
c#·github·.net·开源项目
半亩码田12 小时前
C#转Python第5.1篇:异步编程:asyncio vs async/await,语法相似但机制不同
开发语言·python·c#
阿华田51212 小时前
Java 类加载冲突实战:解决 is not an instance of
c#·linq
xiangyun6113 小时前
C++ list 模拟实现(一):手撕双向链表,从节点到迭代器
数据库·c++·算法·链表·stl·list
samble1 天前
从零搭建灌装监控系统(十七):LiveCharts 实时温度曲线
c#·wpf·mvvm·modbus·工业控制
淡海水1 天前
02-07-原理篇-GC暂停时间的本质
开发语言·unity·c#·gc·暂停时间
小羊没烦恼!1 天前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式