gpt4 book ai didi

.net - 为什么在 System.Object 中定义的 MemberwiseClone protected ?

转载 作者:行者123 更新时间:2023-12-03 23:51:28 27 4
gpt4 key购买 nike

我想知道为什么 MemberwiseClone 被定义为 protected 。这意味着只有派生类型可以访问它。如果它被定义为公共(public),有什么问题?

最佳答案

Pavel Minaev's answer from another discussion:

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

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

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

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

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

关于.net - 为什么在 System.Object 中定义的 MemberwiseClone protected ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3272363/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com