// OK
struct MyStruct
{
static void Foo() { }
}
// Error
static struct MyStruct
{
}
28
A
回答
36
由於您無法創建靜態類型的實例,因此static struct
的行爲與static class
的行爲完全相同。所以,沒有理由去創造它們。我認爲從理論上可能有一個static struct
但它會令人困惑 - 你會如何選擇static class
和static struct
如果兩者的行爲是正好一樣嗎?
需要注意的是一個結構裏面static
方法是,你可以將它們用於相關的結構操作非常有用,例如DateTime.TryParse
等
從技術上講我不認爲現在的C#編譯器&運行時可能會產生類似於static struct
的內容,因爲內部(在IL級別)static class
是標記爲abstract
和sealed
的類。我想你不能創建struct
,這將是abstract
和sealed
(在IL中)。
11
我認爲關鍵是,結構是一個值類型,而不是引用類型。這就像是說「我的整個程序只有一個int
實例,它可以有不同的值,但一次只能有一個。」此外,無論何時將結構作爲參數傳遞,它都會通過值傳遞,也就是將結構的副本製作並放置在堆棧上。這違背了靜態定義的目的 - 這應該意味着只有(永遠)一個事物被定義的實例。如果你試圖創建的實際上是一個Singleton,那麼考慮到它具有比結構更好的創建語義,類是一個更好的方法來處理它。
3
這裏的關鍵是,在類上修改的靜態強制(除其他事項外)不能創建該類的實例。這是通過強制私有構造函數完成的。
CLR沒有任何方法來阻止創建一個結構類型的實例。即使沒有公共默認構造函數,只需聲明
struct S { }
S[] items = new S[]{1};
將創建一個結構的實例,並將所有關聯的內存設置爲零位。
這是從參考類型(類),其中相同的代碼將創建指定類型的參考(引用沒有對象又名空),但不是該對象本身的一個實例不同。
相關問題
- 1. 爲什麼我們要聲明一個靜態方法
- 2. createOperate方法不能被聲明爲靜態;靜態方法只能在靜態或頂級類型中聲明
- 3. 爲什麼我們可以有靜態最終成員,但不能在內部類中使用靜態方法?
- 4. 在非靜態類中聲明一個靜態方法的意義是什麼?
- 5. Rust靜態結構聲明
- 6. 靜態聲明的結構
- 7. 爲什麼我們不能在C編程語言的結構中聲明一個靜態變量?
- 8. 在Java中,如果一個方法使用靜態成員,爲什麼它本身應該聲明爲靜態?
- 9. PHP - 是否可以聲明靜態和非靜態方法
- 10. 靜態結構聲明用C
- 11. 爲什麼不能在非靜態塊中聲明靜態最終變量?
- 12. 爲什麼說方法不是靜態時它是靜態的?
- 13. 爲什麼只有靜態字段可以聲明爲'const'?
- 14. 爲什麼可以調用非靜態類的靜態方法?
- 15. 爲什麼非靜態方法可以訪問靜態字段?
- 16. 爲什麼C#不允許變量在方法中聲明爲靜態?
- 17. 爲什麼C#靜態類包含非靜態類/結構體?
- 18. C++靜態聲明
- 19. 我們可以有一個虛擬的靜態方法嗎? (C++)
- 20. 靜態結構方法和靜態類方法有什麼區別?
- 21. 爲什麼WebMethod聲明爲靜態?
- 22. 爲什麼不能在類中聲明const靜態字符串
- 23. 可以在C中聲明一個靜態變量extern:
- 24. 爲什麼我們要在普通類中聲明靜態類?
- 25. 爲什麼在一個方法中看不到「私有靜態」?
- 26. C++:靜態成員不能在聲明中定義,但靜態函數變量可以?
- 27. C#中靜態變量的用法是什麼?何時使用它?爲什麼我不能在方法中聲明靜態變量?
- 28. 靜態方法聲明但沒有定義錯誤C++
- 29. 你可以在靜態方法中調用非靜態方法嗎?
- 30. 爲什麼你不能在Java中使用相同方法簽名的靜態和非靜態方法?
對於[代表](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