2013-07-10 75 views
10

AFAIK void在編程語言方面沒有任何意義。那麼爲什麼在.Net框架中它被聲明爲struct爲什麼返回類型void在.NET中聲明爲struct?

using System.Runtime.InteropServices; 

namespace System 
{ 
    /// <summary> 
    /// Specifies a return value type for a method that does not return a value. 
    /// </summary> 
    /// <filterpriority>2</filterpriority> 
    [ComVisible(true)] 
    [Serializable] 
    [StructLayout(LayoutKind.Sequential, Size = 1)] 
    public struct Void 
    { 
    } 
} 

回答

15

System.Void是一個有效的標記類型 - 像MethodInfo.ReturnType成員必須有代表void的一些方式,並System.Void是.NET團隊選擇了這樣做的方式。

你不應該像使用普通類型那樣使用它。這是一種解決方法,有效 - 有點像F# Unit type,但沒有完全集成到類型系統中。

+0

ty這麼好的答案先生! –

+0

如果void已經很好地集成到.net中,而不是用作解決方法,它會不會提供更好的性能? –

+1

@AppDeveloper,我認爲它不會影響性能,它真的只是控制函數如何編譯,以及它們是否返回值。 C#無效函數或VB子只是不返回值,所以用於推送/彈出堆棧值的IL代碼只是省略。 – Kratz

2

方法描述符包含方法返回類型的字段。雖然對於void函數可能有該字段爲null,但這需要那些希望例如報告方法的返回類型這樣說:

string theReturnType = theMethod.ReturnType ? theMethod.ReturnType.ToString() : "null"; 

,而不是簡單地說:

string theReturnType = theMethod.ReturnType.ToString(); 

有足夠的情況下,代碼必須與方法的返回類型的東西,有特殊情況的空在所有這些方面都會比僅僅具有可以返回的虛擬類型「null」更加麻煩。

順便說一句,儘管據我所知void是唯一可用於方法返回值但沒有其他目的的類型,但在其他情況下,有一種類型可用於公開返回值,但不在外部存儲位置聲明中使用,例如在編寫流暢接口時(如果外部代碼可以訪問biz.boz(3)的成員,但不能存儲該值本身,那麼在biz.boz(3).foo(9).bar(2).build()foo方法可以知道它在宇宙中的任何地方對boz(3)返回的對象持有唯一的參考,並且因此可以在其方便的時候自由地對其進行變異或返回新的實例)。

相關問題