复制构造函数与Clone()

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

慕斯709654
浏览 473回答 3
3回答

天涯尽头无女友

在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();    }}
打开App,查看更多内容
随时随地看视频慕课网APP