为什么System.Object中定义的MemberwiseClone受到保护?

had*_*adi 13 .net

我想知道为什么MemberwiseClone被定义为受保护.这意味着只有派生类型才能访问它.如果将其定义为公共问题,会出现什么问题?

小智 5

Pavel Minaev 在另一个讨论中的回答:

其他人已经解释了 MemberwiseClone,但没有人解释为什么它受到保护。我会试着给出理由。

这里的问题是 MemberwiseClone 只是盲目地复制状态。在许多情况下,这是不可取的。例如,对象可能有一个私有字段,它是对列表的引用。一个浅拷贝,比如 MemberwiseClone 所做的,会导致新对象指向同一个列表——并且编写这个类很可能不希望列表与其他人共享。

或者一个对象可以有某种 ID 字段,在构造函数中生成——同样,当你克隆它时,你会得到两个具有相同 ID 的对象,这可能会导致假设 ID 是唯一的方法中的各种奇怪的失败。

或者说你有一个打开套接字或文件流的对象,并存储对它的引用。MemberwiseClone 只会复制引用 - 您可以想象两个对象试图交错调用同一个流的结果不会很好。

简而言之,“克隆”不是针对任意对象的明确定义的操作。在 C++ 中默认为所有类提供 memberwise operator= 的事实更令人讨厌,因为人们经常忘记它在那里,并且不要为复制没有意义的类禁用它,或者是危险的(并且出奇地有很多这样的类)。

  • 下次值得将问题标记为重复项,而不是复制并粘贴答案。 (2认同)

Mar*_*ell 5

  • 很多东西被克隆是没有意义的;例如,任何与非托管句柄通信的东西
  • 大多数对象不需要克隆工具
  • 深复制的东西正常真的很难,如果你去的几个简单的情况外
  • 在很多情况下,有比盲目克隆更好的比喻
  • 手动将克隆工具添加到需要它的类型非常容易

对我来说,默认情况下不应其添加到公共 API 中是显而易见的。