Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么空虚是一种结构?_C#_.net - Fatal编程技术网

C# 为什么空虚是一种结构?

C# 为什么空虚是一种结构?,c#,.net,C#,.net,我意识到在Microsoft.NET框架中,void返回类型是一种结构。为什么? ... public void TestMethod() { } ... 框架用于表示用于反射的void返回类型关键字。尽管void意味着缺少返回值,但从技术上讲,它仍然是一种类型,为了在代码中表达为这种类型,它必须是结构(值类型)或类(引用类型) 有关示例,请参见 至于为什么框架设计者选择将System.Void作为一个结构而不是一个类,这是任何人的猜测,但它首先必须由一个类型来表示。我同意这样的评论,即它是

我意识到在Microsoft.NET框架中,
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
,因此这可能取决于实现。