我意識到,在Microsoft .NET Framework中,void
返回類型是一種結構。爲什麼?爲什麼Void是一個結構?
...
public void TestMethod()
{
}
...
我意識到,在Microsoft .NET Framework中,void
返回類型是一種結構。爲什麼?爲什麼Void是一個結構?
...
public void TestMethod()
{
}
...
框架使用a value type called System.Void
來表示用於與反射使用void
返回類型關鍵字。儘管void
意味着缺少返回值,但它在技術上仍然是一種類型,爲了在代碼中表達它,它必須是結構(值類型)或類(引用類型)。
查看MethodInfo.ReturnType
舉例。至於爲什麼框架設計者選擇製作System.Void
一個結構而不是一個類是任何人的猜測,但它必須首先由一個類型來表示。我同意這樣的意見,即避免通常與參考查找相關的不必要開銷,以及其他優化。
我的「最佳猜測」是他們希望它能夠檢查代碼,儘可能接近返回0字節的代碼。沒有字段的結構是0字節,其中 - 作爲類引用是4或8.儘管重要的是,在IL級別,它顯然不會返回任何內容,並且試圖「彈出」這些0字節會導致IL驗證失敗。 – 2012-07-16 05:57:13
補充閱讀: 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
有趣的是,我似乎無法在參考源中的任何位置找到'struct Void'的實際聲明。通常他們會在源註釋中對這些事情做一些解釋。 – 2012-07-16 06:09:25
我認爲該操作將[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
事實上,關鍵點在這裏:一個'void'方法**不會**(以IL術語)返回任何東西。如果你編寫了試圖讀取或「彈出」來自這種方法的返回值的IL,那麼CLI(和PEVerify)會告訴你,你已經對堆棧進行了修復。 – 2012-07-16 05:55:52
Rx設計人員還爲['Unit'](http://msdn.microsoft.com/en-us/library/system.reactive.unit(v = vs.103))提供了一個結構,無論是價值。可能與「虛空」保持一致。 – ligos 2012-07-16 06:04:07