C# 为什么空虚是一种结构?
我意识到在Microsoft.NET框架中,C# 为什么空虚是一种结构?,c#,.net,C#,.net,我意识到在Microsoft.NET框架中,void返回类型是一种结构。为什么? ... public void TestMethod() { } ... 框架用于表示用于反射的void返回类型关键字。尽管void意味着缺少返回值,但从技术上讲,它仍然是一种类型,为了在代码中表达为这种类型,它必须是结构(值类型)或类(引用类型) 有关示例,请参见 至于为什么框架设计者选择将System.Void作为一个结构而不是一个类,这是任何人的猜测,但它首先必须由一个类型来表示。我同意这样的评论,即它是
void
返回类型是一种结构。为什么?
...
public void TestMethod()
{
}
...
框架用于表示用于反射的void
返回类型关键字。尽管void
意味着缺少返回值,但从技术上讲,它仍然是一种类型,为了在代码中表达为这种类型,它必须是结构(值类型)或类(引用类型)
有关示例,请参见
至于为什么框架设计者选择将
System.Void
作为一个结构而不是一个类,这是任何人的猜测,但它首先必须由一个类型来表示。我同意这样的评论,即它是为了避免与引用查找相关的不必要的开销,以及其他优化。我认为op混淆了反射中使用的关键字和结构。事实上,这里的关键点是:void
方法(在IL术语中)不会返回任何内容。如果您编写的IL试图读取或“弹出”这样一个方法的返回值,那么CLI(和PEVerify)会告诉您堆栈已损坏。Rx设计器还提供了一个struct for,不管值多少钱。可能与Void
@ligos保持一致:单元返回方法确实返回了一些东西,而Void返回方法则没有。将单元设置为结构可以避免无用的参考查找。这是一个微小的优化,但没有成本。我的“最佳猜测”是,他们希望它看起来,检查代码,尽可能接近返回0字节的内容。没有字段的结构是0字节,其中类引用是4或8字节。虽然重要的是,在白细胞介素水平上,它显然不返回任何东西,并试图“弹出”这0个字节将导致IL验证失败。@BoltClock只是查看了文档和系统。Void
类型似乎没有任何公共属性或任何表示它包含任何状态的指示-我猜想有人选择了struct
,以避免反射期间的引用类型开销。遗憾的是,您不能这样做使用void
作为泛型的类型。您可以在SSCLI20源代码中找到它。没有解释。顺便说一句,它的大小是1,Marshal.SizeOf(typeof(void))。如果有人感兴趣,Marshal.SizeOf(typeof(void))
在mono:中是0
,因此这可能取决于实现。