您的位置:首页 > 编程语言 > C#

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();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: