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

时间:2013-09-06 00:11:18

标签: c#

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

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

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

2 个答案:

答案 0 :(得分:10)

不完全“只是语法糖”。来自MSDN

  

虽然ValueType是值类型的隐式基类,但是   无法创建直接从ValueType继承的类。代替,   个人编译器提供语言关键字或构造(例如   结构在C#和Structure ...结构在Visual Basic中)支持   创造价值类型。

所以可以你说struct只是classSystem.ValueType 继承语义?这是值得商榷的。所有struct都来自System.ValueType,但您无法明确创建源自class的{​​{1}}。

此外,当然,仅仅源自System.ValueTypeSystem.ValueType与您可能知道的struct有很多不同之处。但如果没有,我有一篇关于一些主要差异的博客文章here,包括但不限于:

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

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

答案 1 :(得分:5)

Class and struct differences

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

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

另请参阅:Choosing Between Classes and Structures