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();
}
}
- 3 回答
- 0 关注
- 491 浏览
添加回答
举报