为了账号安全,请及时绑定邮箱和手机立即绑定

复制构造函数与Clone()

复制构造函数与Clone()

C#
慕斯709654 2019-12-21 11:33:45
在C#中,向类添加(深度)复制功能的首选方法是什么?是应该实现副本构造函数,还是应该派生ICloneable并实现该Clone()方法?
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

在C#中,向类添加(深度)复制功能的首选方法是什么?是应该实现复制构造函数,还是应该从ICloneable派生并实现Clone()方法?


ICloneable正如其他人提到的那样,它的问题在于它没有指定是深拷贝还是浅拷贝,这使得它实际上不可用,并且在实践中很少使用。它也返回object,这很痛苦,因为它需要大量的转换。(尽管您在问题中特别提到了类,但ICloneable在structrequire box上实现。)


复制构造者也遭受ICloneable的问题之一。复制构造函数是在进行深层复制还是浅层复制,这一点并不明显。


Account clonedAccount = new Account(currentAccount); // Deep or shallow?

最好创建一个DeepClone()方法。这样,意图就很清楚了。


这就提出了一个问题,它应该是静态方法还是实例方法。


Account clonedAccount = currentAccount.DeepClone();  // instance method

要么


Account clonedAccount = Account.DeepClone(currentAccount); // static method

有时候,我稍微偏爱静态版本,因为克隆似乎是对对象执行的操作,而不是对象正在执行的操作。无论哪种情况,在克隆属于继承层次结构的对象时都将要处理一些问题,而如何解决这些问题最终可能会推动设计。


class CheckingAccount : Account

{

    CheckAuthorizationScheme checkAuthorizationScheme;


    public override Account DeepClone()

    {

        CheckingAccount clone = new CheckingAccount();

        DeepCloneFields(clone);

        return clone;

    }


    protected override void DeepCloneFields(Account clone)

    {

        base.DeepCloneFields(clone);


        ((CheckingAccount)clone).checkAuthorizationScheme = this.checkAuthorizationScheme.DeepClone();

    }

}


查看完整回答
反对 回复 2019-12-21
  • 3 回答
  • 0 关注
  • 471 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信