猿问
复制构造函数与Clone()
在C#中,向类添加(深度)复制功能的首选方法是什么?是应该实现副本构造函数,还是应该派生ICloneable并实现该Clone()方法?
慕斯709654
浏览 492
回答 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(); }}
0
0
0
随时随地看视频
慕课网APP
相关分类
C#
typedef入门问题
1 回答
我要回答