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);
相关推荐
公子小六3 小时前
基于.NET的Windows窗体编程之WinForms滑块与上下控件
windows·microsoft·c#·.net·winforms
曹牧4 小时前
C#:文本文件读取
服务器·前端·c#
2601_967338714 小时前
C#上位机开发零基础入门到精通全套视频
开发语言·c#
.YM.Z6 小时前
C++ STL 容器深度剖析:vector 与 list 的模拟实现及对比
开发语言·c++·vector·list
czhc114007566310 小时前
2026-09-03 博客:配置与密码 · 合并代码 · 超时排查
c#
格林威12 小时前
C#图像夜间识别率提升:使用OpenCvSharp和Halcon融合DeepSORT实现复杂场景下准确识别
开发语言·人工智能·数码相机·机器学习·计算机视觉·c#·视觉检测
重生之小比特12 小时前
【初阶C++】list
开发语言·c++·list
曹牧14 小时前
C#:线程间操作无效,不是从创建控件线程访问
开发语言·c#
anlog1 天前
ini文件读取,EXE同目录文件读取
c#·ini
rockey6271 天前
AScript之编译递归函数
c#·.net·script·动态脚本