C# List深拷贝和浅拷贝的简单案例说明
2016-04-14 23:36
218 查看
基本说明
当List的元素类型是复杂类型时,使用它的拷贝函数拷贝出来的内容是浅拷贝的,不会自动再去调用元素的拷贝构造函数,如下例子:using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DTATest { class Program { class Node { public int a; public Node(int a) { this.a = a; } public Node(Node a) { this.a = a.a; } } static List<Node> l, r; static void Main(string[] args) { l = new List<Node>(); l.Add(new Node(1)); l.Add(new Node(2)); r = new List<Node>(l); r[0].a += 2; r[1].a -= 5; Console.WriteLine(l[0].a + "," + l[1].a); Console.Read(); } } }
结果是3,-3,明显是浅拷贝
这个想要深拷贝,好像没有特别简单的方式,必须真的去插入,或者像有的Blog里讲的用序列化去做(可是感觉好麻烦。。如:/article/7639950.html)
个人理解是,如果复杂类型里又套着复杂类型,而复杂类型中的拷贝构造函数没有特意去深拷贝,还是会出现没有完全深拷贝的情况,所以最保险的方式是用序列化法
但是当类型是我们自己定义,比较明确的时候,可以用我下面给出的这种用Linq解决的办法,写起来形式非常简单~
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DTATest { class Program { class Node { public int a; public Node(int a) { this.a = a; } public Node(Node a) { this.a = a.a; } } static List<Node> l, r; static void Main(string[] args) { l = new List<Node>(); l.Add(new Node(1)); l.Add(new Node(2)); r = new List<Node>(); l.ForEach(i => r.Add(new Node(i))); r[0].a += 2; r[1].a -= 5; Console.WriteLine(l[0].a + "," + l[1].a); Console.Read(); } } }
相关文章推荐
- [C#]大小端字节序(Big Endian和Little Endian)
- C# 解决 调用线程非安全的控件xx不是在本线程上创建 异常
- c#使用wpd读取便携式设备信息二
- C#编程基础 实验(6) (1-3)
- C#—结构与枚举
- c#---读文件
- C#单例模式使用
- C#实现优先队列 基于二叉堆 附使用案例
- C# 使用Tuple传递多个参数
- C# Interlocked 笔记
- C# Timer类详解
- C# get
- C# 单例模式的不同写法对静态变量的影响
- c#XML配置文件辅助类
- C# Socket SSL通讯笔记
- C# DataTable添加行和列
- C# 数组与 list 互相转换案例
- c#概念理解
- 适用于WebForm Mvc的Pager分页组件C#实现
- C#委托与事件的本质区别