是否有记录的通用基类?
c#
c#-9.0
在 .NET 类型系统中,所有引用类型都来自System.Object,System.ValueType我认为所有值类型都来自。是否还有一个所有record类型都派生自的公共基类?如果没有,为什么不呢?
回答
是否还有一个所有记录类型都派生自的公共基类?
不,至少不是任何特定于记录的东西。记录只是引用类型。它们可以直接源自System.Object或源自其他记录类型。
如果没有,为什么不呢?
它们不需要像值类型那样由运行时进行特殊处理。它们的所有特别之处都在编译器为它们生成的代码中。
“根”记录
记录可以直接从 派生System.Object,无论是隐式还是显式,就像任何class可以。第一级记录类型引导记录的内部结构,建立记录类型层次结构的根。
-
复制构造函数——一个受保护的构造函数,它接受对相同类型的引用并复制其属性。派生记录将从它们的复制构造函数中调用它。
-
克隆方法-它本质上是什么
ICloneable<T>.Clone()就已经有它以往任何时候都基类库的一部分,但是这其中有一个不可寻址的名称:<Clone>$。当您使用with关键字时,它调用<Clone>$,它使用复制构造函数创建一个新实例,然后编译器允许在初始化表达式中设置任何仅用于初始化的属性。 -
平等成员——这是一个大问题,因为记录是关于值语义的。在
GetHashCode和Equals从方法System.Object被覆盖,并且IEquatable<T>.Equals()实现。还有一个名为 protected 的属性EqualityContract,用于相等性比较,以确保通过仅比较公共部分来确保不同类型的记录不被视为相等。在==和!=符重载,以及。 -
ToString方法——重载以显示成员记录。它使用一种受保护的PrintMembers方法,该方法调用类层次结构来构建具有所有属性值的字符串。 -
Deconstruct方法——使记录能够被解构为单独的变量。
派生记录
当您System.Object为记录类型指定基本类型(除了)时,它必须是另一种记录类型,因为它需要由记录类型层次结构的根建立的机制。派生记录类型定义了相同的成员,但被标记的成员现在被标记virtual为override。
-
复制构造函数——这将调用基本记录的复制构造函数。
-
Clone 方法-
<Clone>$被覆盖以使用其复制构造函数返回派生程度更高的类型。
有趣的事实:这不会使用新的协变返回特性在被覆盖的方法上声明一个更派生的返回类型,即使它返回一个更派生的类型。那是因为 1) 它不需要,以及 2) 它会使记录无法使用,除非在 .NET 5.0 中,因为在 .NET 5.0 运行时中添加了对该功能的支持。
-
相等成员——相同的方法被覆盖并定义了运算符,但具有考虑相等的任何新属性。
-
ToString方法-ToString并被PrintMembers覆盖。ToString在字符串中产生实际的类名和花括号。不调用基本实现。PrintMembers分别构建属性名称和值。 -
Deconstruct方法——这里没有覆盖,因为基类的方法没有被标记virtual。如果引入了新属性,则签名与基类的签名不同,因此无需覆盖任何内容。如果没有引入新属性,则该方法被标记new为隐藏基类中的那个。
这就是为什么不需要记录的特殊基类型的原因。
特别说明:
标记记录后sealed,通常会protected virtual(但不会protected override)成为private. 它的广泛程度取决于它是源自System.Object还是其他记录类型。
以上都没有考虑通过提供您自己的任何通常由编译器实现的方法实现的方式进行定制。