2010-04-10 101 views
28
// OK 
struct MyStruct 
{ 
    static void Foo() { } 
} 

// Error 
static struct MyStruct 
{ 
} 
+0

對於[代表](http://stackoverflow.com/questions/6835766/why-can-a-net-delegate-not-be-declared-static)和[enums](http:// stackoverflow.com/questions/4567868/troubles-declaring-static-enum-c-sharp) – nawfal 2014-01-02 17:05:53

回答

36

由於您無法創建靜態類型的實例,因此static struct的行爲與static class的行爲完全相同。所以,沒有理由去創造它們。我認爲從理論上可能有一個static struct但它會令人困惑 - 你會如何選擇static classstatic struct如果兩者的行爲是正好一樣嗎?

需要注意的是一個結構裏面static方法是,你可以將它們用於相關的結構操作非常有用,例如DateTime.TryParse

從技術上講我不認爲現在的C#編譯器&運行時可能會產生類似於static struct的內容,因爲內部(在IL級別)static class是標記爲abstractsealed的類。我想你不能創建struct,這將是abstractsealed(在IL中)。

11

我認爲關鍵是,結構是一個值類型,而不是引用類型。這就像是說「我的整個程序只有一個int實例,它可以有不同的值,但一次只能有一個。」此外,無論何時將結構作爲參數傳遞,它都會通過值傳遞,也就是將結構的副本製作並放置在堆棧上。這違背了靜態定義的目的 - 這應該意味着只有(永遠)一個事物被定義的實例。如果你試圖創建的實際上是一個Singleton,那麼考慮到它具有比結構更好的創建語義,類是一個更好的方法來處理它。

3

這裏的關鍵是,在類上修改的靜態強制(除其他事項外)不能創建該類的實例。這是通過強制私有構造函數完成的。

CLR沒有任何方法來阻止創建一個結構類型的實例。即使沒有公共默認構造函數,只需聲明

struct S { } 

S[] items = new S[]{1}; 

將創建一個結構的實例,並將所有關聯的內存設置爲零位。

這是從參考類型(類),其中相同的代碼將創建指定類型的參考(引用沒有對象又名空),但不是該對象本身的一個實例不同。

相關問題