为什么Void是一个结构?

far*_*ran 22 .net c#

我意识到在Microsoft .NET Framework中,void返回类型是一种结构.为什么?

...
public void TestMethod()
{

}
...
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 28

该框架使用一个值类型来调用,System.Void以表示void与反射一起使用的返回类型关键字.虽然void意味着缺少返回值,但它在技术上仍然是一种类型,并且为了在代码中表达它,它必须是结构(值类型)或类(引用类型).

请参阅MethodInfo.ReturnType示例.

至于为什么框架设计者选择创建System.Void一个结构而不是一个类是任何人的猜测,但它必须首先由一个类型表示.我同意这些评论是为了避免通常与参考查找相关的不必要的开销,以及其他优化.

  • 我的"最佳猜测"是他们希望它看起来,检查代码,尽可能接近返回0字节的东西.没有字段的结构是0字节,其中 - 作为类引用是4或8.虽然重要的是,在IL级别它显然不返回任何东西,并且试图"弹出"那些0字节将导致IL验证失败. (17认同)
  • 如果有人有兴趣,`Marshal.SizeOf(typeof(void))`单声道是`0`:http://ideone.com/m8qIl,所以这可能是依赖于实现的. (3认同)
  • @BoltClock只是看着文件和`System.Void`类型没有出现任何公共属性或者说,它包含的任何国家任何迹象 - 我猜测有人选择`struct`避免反射过程中的引用类型的开销. (2认同)
  • 您可以在SSCLI20源中找到它.没有解释.它的大小是1 btw,Marshal.SizeOf(typeof(void)). (2认同)