【发布时间】:2021-01-07 16:17:00
【问题描述】:
C# 9 records feature specification 包括以下内容:
一个记录类型包含两个复制成员:
采用记录类型的单个参数的构造函数。它是 称为“复制构造函数”。综合公众 具有编译器保留名称的无参数实例“克隆”方法
但我似乎无法调用这两个复制成员中的任何一个:
public record R(int A);
// ...
var r2 = new R(r); // ERROR: inaccessible due to protection level
var r3 = r.Clone(); // ERROR: R does not contain a definition for Clone
由此,我了解到构造函数受到保护,因此无法在记录的继承层次结构之外访问。所以我们留下了这样的代码:
var r4 = r with { };
但是克隆呢?根据上述规范,克隆方法是公开的。但它的名字是什么?或者它是一个有效的随机字符串,因此不应在记录的继承层次结构之外调用它?如果是这样,深拷贝记录的正确方法是什么?从规范看来,一个人能够创建自己的克隆方法。是这样吗?它应该如何工作的一个例子是什么?
【问题讨论】:
-
“但是克隆呢?” 这就是
with表达式的作用。您不应该知道“克隆”方法的名称。这就是“编译器保留”的意思。它支持with表达式。 -
表上的实现细节:名字是
<Clone>$。按照设计,您不能自己调用它。 -
它没有。这种克隆机制是浅拷贝。您链接的文档在任何地方都不包含“深度”一词。如果你想要一个深拷贝,你需要自己实现。
-
@madreflection 谢谢。我认为让我感到困惑的是文档中“复制”和“克隆”的使用,但是您没有使用“深度”这个词是正确的,因此必须以其他方式实现。我也对文档的声明“如果基本记录中存在虚拟“克隆”方法,......”感到困惑,据我所知,这始终是综合创建的 Clone() 方法,而不是用户定义的一;尝试自己创建这样的方法会产生错误。
-
应该注意 imo,“浅拷贝”是一个定义明确的概念,而“深拷贝”不是。
标签: c# copy clone record c#-9.0