当前位置:  开发笔记 > 编程语言 > 正文

我为什么要在c#中实现ICloneable?

如何解决《我为什么要在c#中实现ICloneable?》经验,为你挑选了4个好方法。

你能解释一下为什么我应该继承ICloneable并实现这个Clone()方法吗?

如果我想做一个深层复制,我不能只实现我的方法吗?我们说吧MyClone()

我为什么要继承ICloneable?有什么好处?这只是让代码"更具可读性"的问题吗?



1> Matt Hamilto..:

你不应该.Microsoft建议不要实现,ICloneable因为接口没有明确指示您的Clone方法是执行"深度"还是"浅层"克隆.

有关详细信息,请参阅2003年布拉德艾布拉姆斯的这篇博文(!).


Wayback链接到文章,现在是404:http://web.archive.org/web/20040419170407/http://blogs.msdn.com/brada/archive/2003/04/09/49935.aspx
一个更好的链接:https://blogs.msdn.microsoft.com/brada/2004/05/03/should-we-obsolete-icloneable-the-slar-on-system-icloneable/

2> supercat..:

ICloneable接口本身并不是非常有用,这是说,真的没有很多情况下是非常有用的知道,一个目的是在不知道任何关于它可复制.这与eg IEnumerableIDisposable; 是完全不同的情况; 有很多情况下接受一个IEnumerable不知道除了如何枚举之外的任何东西是有用的.

另一方面,ICloneable当作为通用约束与其他约束一起应用时可能是有用的.例如,基类可能有用地支持许多衍生物,其中一些可以被有效地克隆,而其中一些则不能.如果基类型本身暴露了公共克隆接口,那么任何无法克隆的衍生类型都会违反Liskov替换原则.避免此问题的方法是使用Protected方法使基类型支持克隆,并允许派生类型在他们认为合适时实现公共克隆接口.

一旦完成,一个想要接受一个WonderfulBase类型的对象并且需要能够克隆它的方法可以被编码为接受支持克隆的WonderfulBase对象(使用具有基类型和ICloneable约束的泛型类型参数) .尽管ICloneable界面本身并不表示深度或浅层克隆,但文档中的文档WonderfulBase表明克隆是否WonderfulBase应该是深度克隆还是浅克隆.本质上,ICloneable接口不会完成通过定义无法完成的任何事情ICloneableWonderfulBase,除了它将避免必须为每个不同的可克隆基类定义不同的名称.


并不是非常有用,这是说,真的没有很多情况下是非常有用的知道,一个目的是在不知道任何关于它可复制.这与eg

3> JoshBerke..:

ICloneableBCL中的其中一件产品一直备受争议.恕我直言,没有真正的理由来实施它.有了这个说如果我要创建克隆方法然后我实现ICloneable,我提供自己的强类型版本Clone.

问题ICloneable是它是否从未表明Clone是浅层还是深层复制是非常不同的东西.事实上,没有ICloneable可能表明微软对ICloneable的看法



4> John Rasch..:

马特是对的,不要用它.创建您自己的Copy()方法(或类似名称),并在您的公共API中清楚地表明您的方法是创建对象的深层还是浅层副本.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有