结构只是一个派生自 ValueType 的类
本文关键字:派生 一个 ValueType 的类 结构 | 更新日期: 2023-09-27 18:30:25
说结构体只是一个继承自System.ValueType的类是真的吗?
关键字"struct"只是在名称后编写具有:System.ValueType的类的语法糖吗?
如果它只是一个类,那么说并非所有类都是引用类型,因为结构在技术上是类,这是真的吗?
不完全是"只是语法糖"。 从 MSDN:
尽管 ValueType 是值类型的隐式基类,但 无法创建直接从 ValueType 继承的类。相反 单个编译器提供语言关键字或构造(例如 C# 中的结构和结构...Visual Basic 中的结束结构)以支持 创建值类型。
那么,你能说struct
只是从System.ValueType
语义上继承而来的class
吗? 这是值得商榷的。 所有struct
都派生自 System.ValueType
,但不能显式创建派生自 System.ValueType
的class
。
此外,当然,只是从System.ValueType
派生而来,您可能知道struct
与class
有很多不同。 但如果没有,我这里有一篇关于一些关键差异的博客文章,包括但不限于:
- 当然,值
- 类型是按值传递和分配的,而不是通过引用。
struct
不能接受定义中字段的初始化值(它们始终为其声明的字段类型提供值)。struct
可以有事件,但由于它们是值类型,因此必须注意不要订阅副本!- 不能从
struct
继承。 - 不能创建
struct
无参数构造函数,struct
提供了一个无法重写的构造函数。 - 创建重载的
struct
构造函数不会隐藏无参数构造函数。 struct
中使用的this
关键字是值变量,而不是引用。- 您不需要使用
new
来创建struct
的实例(但如果这样做,则必须在使用之前为所有字段提供一个值。
MSDN也有一些关于何时使用struct
与class
的好建议。 因为它们是值类型,所以你应该这样认为,并将它们限制为更小的东西(16字节或更小),最好是单个值的不可变表示形式(如DateTime
、TimeStamp
等)。
类和结构的差异
结构在几个重要方面与类不同:
- 结构是值类型(第 11.3.1 节)。
- 所有结构类型都隐式继承自类 System.ValueType(第 11.3.2 节)。
- 对结构类型的变量赋值会创建所赋值的副本(第 11.3.3 节)。
- 结构的默认值是通过将所有值类型字段设置为默认值并将所有引用类型字段设置为 null 而生成的值(第 11.3.4 节)。 装箱
- 和取消装箱操作用于在结构类型和对象之间进行转换(第 11.3.5 节)。
- 对于结构体,其含义不同(第 11.3.6 节)。
- 结构的实例字段声明不允许包含变量初始值设定项(第 11.3.7 节)。
- 不允许结构声明无参数实例构造函数(第 11.3.8 节)。
- 不允许结构声明析构函数(第 11.3.9 节)。
另请参阅:在类和结构之间进行选择