C# List深拷贝和浅拷贝的简单案例说明

时间:2021-11-10 19:50:16

基本说明

  • 当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里讲的用序列化去做(可是感觉好麻烦。。如:http://blog.csdn.net/xjavasunjava/article/details/7648242
  • 个人理解是,如果复杂类型里又套着复杂类型,而复杂类型中的拷贝构造函数没有特意去深拷贝,还是会出现没有完全深拷贝的情况,所以最保险的方式是用序列化法
  • 但是当类型是我们自己定义,比较明确的时候,可以用我下面给出的这种用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();
}
}

}