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

基本说明

  • 当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 l, r;

        static void Main(string[] args)
        {
            l = new List();
            l.Add(new Node(1));
            l.Add(new Node(2));
            r = new List(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 l, r;

        static void Main(string[] args)
        {
            l = new List();
            l.Add(new Node(1));
            l.Add(new Node(2));
            r = new List();
            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#语言)