在 .NET 类型系统中,所有引用类型都派生自System.Object
,所有值类型来自System.ValueType
我认为。是否也有一个共同的基类?record
类型源自?如果没有,为什么不呢?
是否还有一个所有记录类型派生自的公共基类?
不,至少没有任何特定于记录的内容。记录只是参考类型。它们可以直接派生自System.Object
或来自其他记录类型。
如果没有,为什么不呢?
它们不需要像值类型那样由运行时进行特殊处理。它们的所有特殊之处都在编译器为它们生成的代码中。
“根”记录
记录可以直接源自System.Object
,无论是隐式的还是显式的,就像任何class
能。记录类型的第一级引导记录的内部,建立记录类型层次结构的根。
-
复制构造函数-- 受保护的构造函数,接受对同一类型的引用并复制其属性。派生记录将从其复制构造函数中调用此函数。
-
克隆方法——本质上就是这样ICloneable<T>.Clone()
would它曾经是基类库的一部分,但它有一个无法寻址的名称:<Clone>$
。当您使用with
关键字,它调用<Clone>$
,它使用复制构造函数创建一个新实例,然后编译器允许在初始化表达式中设置任何仅限 init 的属性。
-
平等会员——这是一件大事,因为记录是关于值语义. The GetHashCode
and Equals
方法来自System.Object
被覆盖,并且IEquatable<T>.Equals()
已实施。还有一个名为的受保护属性EqualityContract
用于相等性比较,通过仅比较公共部分来确保不同类型的记录不被视为相等。这==
and !=
运算符也超载。
-
ToString
method-- 重载以显示记录的成员。它使用受保护的PrintMembers
方法,它调用类层次结构来构建包含所有属性值的字符串。
-
Deconstruct
method-- 使记录能够被解构为单独的变量。
派生记录
当您指定基本类型(除了System.Object
)对于记录类型,它必须是另一种记录类型,因为它需要由记录类型层次结构的根建立的机制。派生记录类型定义相同的成员,但已标记的成员virtual
现在已标记override
.
-
复制构造函数-- 这将调用基本记录的复制构造函数。
-
克隆方法 -- <Clone>$
被重写以使用其复制构造函数返回更派生的类型。
有趣的事实: This does not使用新的协变返回功能declare重写方法上的更派生的返回类型,即使它返回更派生的类型。这是因为 1) 它不需要,2) 它会使记录不可用(除了在 .NET 5.0 中),因为对该功能的支持是在 .NET 5.0 运行时中添加的。
-
平等会员-- 覆盖相同的方法并定义运算符,但考虑相等的任何新属性。
-
ToString
method -- ToString
and PrintMembers
被覆盖。ToString
生成字符串中的实际类名和大括号。不调用基本实现。PrintMembers
单独构建属性名称和值。
-
Deconstruct
method-- 这里没有重写,因为基类的方法没有标记virtual
。如果引入新属性,则签名与基类的签名不同,因此无需覆盖任何内容。如果没有引入新的属性,则该方法被标记new
来跟踪基类中的那个。
这就是为什么不需要特殊的记录基类型。
特别提示:
当记录被标记时sealed
,通常是的成员protected virtual
(但不是protected override
) 变得private
。它的范围有多大取决于它是否源自System.Object
或其他记录类型。
以上都没有考虑通过提供您自己的编译器通常实现的任何方法的实现来进行自定义。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)