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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值