C# 深度复制

项目中,有人遇到个问题。

(引用)

ICloneable听起来是个好主意:可以为 那些支持复制的类型实现ICloneable接口。如果不想支持复制,那就不要实现它。但是我们的类型并非活在真空中。让一个类型支持 ICloneable接口会影响它的派生类。一旦类型支持ICloneable接口,那么它所有的派生类也都必须支持它。而且,其所有成员类型也都要支持 ICloneable接口,或者有其他创建复制的机制。最后,当我们设计的类型包含交织成网状的对象时,支持深复制将变得很困难。ICloneable接 口在其官方的定义里很巧妙地绕过了这个问题,其定义如下:ICloneable接口或者支持深复制(deep copy),或者支持浅复制(shallow copy)。浅复制指的是新对象包含所有成员变量的副本,如果成员变量为引用类型,那么新对象将和原对象引用同样的对象。深复制指的也是新对象包含所有成 员变量的副本,但是所有引用类型的成员变量将被递归地克隆。对于C#的内建类型,例如整数,深复制和浅复制产生的是同样的结果。那么我们的类型应该支持哪 一个?这要根据具体类型而定。但是在同一个对象中混合浅复制和深复制会导致许多不一致的问题。当涉足ICloneable接口时,这样的问题很难逃脱。大 多数情况下,避免ICloneable接口反倒会获得一个比较简单的类——对类的客户来讲比较容易使用,对创建者来讲也比较容易实现。(引用结束)

然后呢,我也做了例子

 

    public class Cloner : ICloneable
    {
        public int a { set; get; }
        public string b { set; get; }

        public string c { set; get; }
        public Cloner(int _a, string _b)
        {
            this.a = _a;
            this.b = _b;
        }

        public Object Clone()
        {
            Cloner cloner = new Cloner(this.a, this.b);
            return cloner;
        }
    }


不过,感觉效果很一般,就想到了,之前用过的序列化。

        public static T DeepClone<T>(this T obj)
        {

            using (var ms = new System.IO.MemoryStream())
            {

                System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf =
                    new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                bf.Serialize(ms, obj);
                ms.Position = 0;
                return (T)bf.Deserialize(ms);
            }
        }


结果,果然可行。所以给大家分享下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值