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

为什么要在C#中实现ICloneable?

为什么要在C#中实现ICloneable?

繁花不似锦 2019-10-09 16:12:51
您能向我解释为什么我应该继承ICloneable并实现该Clone()方法吗?如果要进行深层复制,是否可以仅执行我的方法?比方说MyClone()?我为什么要继承ICloneable?有什么优势?这仅仅是使代码“更具可读性”的问题吗?
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

你不应该 Microsoft建议不要实施,ICloneable因为在界面上没有明确指示您的Clone方法是执行“深层”克隆还是“浅层”克隆。


查看完整回答
反对 回复 2019-10-09
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

ICloneable接口本身并不是很有用,也就是说,实际上在很多情况下,知道一个对象是可克隆的而不知道其他任何信息都是有用的。这种情况与例如IEnumerableor 截然不同IDisposable。在许多情况下,接受一个有用的信息IEnumerable而不是除枚举它以外的任何事情都是有用的。

另一方面,ICloneable当与其他约束一起用作一般约束时,这可能会很有用。例如,基类可能有用地支持许多派生类,其中一些可以被有用地克隆,而另一些则不能。如果基本类型本身公开了公共克隆接口,则任何无法克隆的派生类型都将违反Liskov替换原理。避免此问题的方法是让基本类型支持使用Protected方法的克隆,并允许派生类型在合适的情况下实现公共克隆接口。

完成此操作后,可以将想要接受某种WonderfulBase类型的对象并且需要能够克隆它的方法进行编码,以接受支持克隆的WonderfulBase对象(使用具有基本类型和ICloneable约束的通用类型参数) 。尽管该ICloneable接口本身并不表示深克隆或浅克隆,但有关文档WonderfulBase将指出WonderfulBase可克隆对象应是深克隆还是浅克隆。本质上,该ICloneable接口不会完成定义所无法实现的任何事情ICloneableWonderfulBase,只是该接口可以避免必须为每个不同的可克隆基类定义不同的名称。


查看完整回答
反对 回复 2019-10-09
?
12345678_0001

TA贡献1802条经验 获得超5个赞

ICloneable是BCL中存在争议的工件之一。恕我直言,没有真正的理由来实施它。这样说来,如果我要创建一个克隆方法,那么我会实现ICloneable,并且提供我自己的强类型版本的Clone

问题ICloneable是它从未表明Clone是浅拷贝还是深拷贝,它们是完全不同的东西。没有任何事实ICloneable<T>可能表明微软对ICloneable的想法


查看完整回答
反对 回复 2019-10-09
  • 3 回答
  • 0 关注
  • 1387 浏览

添加回答

举报

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