2

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

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

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

4

2 回答 2

11

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

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

那么你说 astruct只是从语义class上继承的a吗?那值得商榷。所有都派生自,但您不能显式创建派生自 的。System.ValueType structSystem.ValueTypeclassSystem.ValueType

此外,当然,正如您可能知道的那样,只是从System.ValueType,派生出来struct的有很多不同。class但如果没有,我有一篇关于这里的一些关键区别的博客文章,包括但不限于:

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

MSDN 也有一些关于何时使用structvs的好建议class。因为它们是值类型,所以您应该这样看待它们并将它们限制为更小的东西(16 字节或更少),最好是单个值的不可变表示(如DateTimeTimeStamp)。

于 2013-09-06T00:13:36.933 回答
5

Class and struct differences

Structs differ from classes in several important ways:

  • Structs are value types (Section 11.3.1).
  • All struct types implicitly inherit from the class System.ValueType (Section 11.3.2).
  • Assignment to a variable of a struct type creates a copy of the value being assigned (Section 11.3.3).
  • The default value of a struct is the value produced by setting all value type fields to their default value and all reference type fields to null (Section 11.3.4).
  • Boxing and unboxing operations are used to convert between a struct type and object (Section 11.3.5).
  • The meaning of this is different for structs (Section 11.3.6).
  • Instance field declarations for a struct are not permitted to include variable initializers (Section 11.3.7).
  • A struct is not permitted to declare a parameterless instance constructor (Section 11.3.8).
  • A struct is not permitted to declare a destructor (Section 11.3.9).

See also: Choosing Between Classes and Structures

于 2013-09-06T00:14:32.053 回答