结构只是一个派生自ValueType的类吗?

Bac*_*ave 1 c#

是不是说结构只是一个继承自System.ValueType的类?

关键字"struct"只是用于编写类的语法糖:System.ValueType在名称后面吗?

如果它只是一个类,那么说并非所有类都是引用类型是正确的,因为结构在技术上是类吗?

Jam*_*are 10

不完全"只是语法糖".来自MSDN:

尽管ValueType是值类型的隐式基类,但您无法创建直接从ValueType继承的类.相反,单个编译器提供语言关键字或构造(例如C#中的struct和Visual Basic中的Structure ... End Structure)以支持值类型的创建.

所以可能你说,一个struct仅仅是一个class从继承System.ValueType 语义?这是值得商榷的.所有struct都是派生自System.ValueType,但你不能明确地创建一个class派生自System.ValueType.

另外,当然,只是从中衍生而来System.ValueType,与你可能知道的struct有许多不同之处class.但如果没有,我有一篇关于这里的一些主要差异的博客文章,包括但不限于:

  • 当然,值类型是按值传递和分配的,而不是通过引用分配的.
  • A struct不能接受定义中其字段的初始化值(它们始终为其声明的字段类型指定值).
  • A struct可以有事件,但由于它们是值类型,因此必须注意您没有订阅副本!
  • 你无法继承struct.
  • 你不能创建无struct参数构造函数,struct提供一个不能被覆盖的构造函数.
  • 创建重载的struct构造函数不会隐藏无参数构造函数.
  • this在a中使用的关键字struct是值变量,而不是引用.
  • 您不需要new用来创建a的实例struct(但是如果这样做,您必须在使用之前为所有字段提供值.

MSDN对何时使用structvs 也有一些很好的建议class.因为它们是值类型,所以你应该将它们视为这样,并将它们限制为较小的东西(16字节或更少),最好是单个值的不可变表示(如DateTime,TimeStamp等等).


Jer*_*son 5

类和结构的差异

结构在几个重要方面与类不同:

  • 结构是值类型(第11.3.1节).
  • 所有结构类型都隐式继承自System.ValueType类(第11.3.2节).
  • 分配给结构类型的变量会创建所分配值的副本(第11.3.3节).
  • struct的默认值是通过将所有值类型字段设置为其默认值并将所有引用类型字段设置为null而生成的值(第11.3.4节).
  • 装箱和拆箱操作用于在结构类型和对象之间进行转换(第11.3.5节).
  • 结构的含义是不同的(第11.3.6节).
  • 不允许结构的实例字段声明包含变量初始值设定项(第11.3.7节).
  • 不允许结构体声明无参数实例构造函数(第11.3.8节).
  • 不允许结构体声明析构函数(第11.3.9节).

另请参阅:在类和结构之间进行选择