为什么Void是一个结构?

为什么Void是一个结构?

问题描述:

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

... 
public void TestMethod() 
{ 

} 
... 
+2

我认为该操作将[void](http://msdn.microsoft.com/en-us/library/yah0tteb(v = vs.80).aspx)关键字和[System.Void]( http://msdn.microsoft.com/en-us/library/system.void.aspx)反射中使用的结构。 – Strelok 2012-07-16 05:52:20

+6

事实上,关键点在这里:一个'void'方法**不会**(以IL术语)返回任何东西。如果你编写了试图读取或“弹出”来自这种方法的返回值的IL,那么CLI(和PEVerify)会告诉你,你已经对堆栈进行了修复。 – 2012-07-16 05:55:52

+0

Rx设计人员还为['Unit'](http://msdn.microsoft.com/en-us/library/system.reactive.unit(v = vs.103))提供了一个结构,无论是价值。可能与“虚空”保持一致。 – ligos 2012-07-16 06:04:07

框架使用a value type called System.Void来表示用于与反射使用void返回类型关键字。尽管void意味着缺少返回值,但它在技术上仍然是一种类型,为了在代码中表达它,它必须是结构(值类型)或类(引用类型)。

查看MethodInfo.ReturnType举例。至于为什么框架设计者选择制作System.Void一个结构而不是一个类是任何人的猜测,但它必须首先由一个类型来表示。我同意这样的意见,即避免通常与参考查找相关的不必要开销,以及其他优化。

+17

我的“最佳猜测”是他们希望它能够检查代码,尽可能接近返回0字节的代码。没有字段的结构是0字节,其中 - 作为类引用是4或8.尽管重要的是,在IL级别,它显然不会返回任何内容,并且试图“弹出”这些0字节会导致IL验证失败。 – 2012-07-16 05:57:13

+0

补充阅读: http://ahuwanya.net/blog/post/Exploring-SystemVoid-Part-I.aspx http://ahuwanya.net/blog/post/Exploring-SystemVoid-Part-II.aspx – Strelok 2012-07-16 05:58:09

+0

有趣的是,我似乎无法在参考源中的任何位置找到'struct Void'的实际声明。通常他们会在源注释中对这些事情做一些解释。 – 2012-07-16 06:09:25