2012-07-16 124 views
22

我意識到,在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

回答

28

框架使用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