2010-02-11 123 views
21

在C#中,標記靜態類的目的是什麼?在C#中,標記靜態類的目的是什麼?

如果我有一個只有靜態方法的類,我可以將類標記爲靜態或不是。爲什麼我要標記類是靜態的?如果我所有的方法都是靜態的,並且如果我打算永遠不添加非靜態方法,我會不想標記靜態類嗎?

我環顧四周,看到一些類似的問題,但沒有一個像這樣。

+0

http://stackoverflow.com/questions/576853/what-is-the-use-of-a-static-class http://stackoverflow.com/questions/241339/when-to-use-static- classes-in-c – 2010-02-11 22:28:35

+0

問你自己的問題,@dboarman! – Cheeso 2010-02-12 23:18:05

+0

別擔心,不想污染你的問題。以爲有人可能會評論靜態成員的線程安全性。 ;) – IAbstract 2010-02-12 23:58:26

回答

26

將類標記爲靜態是一種聲明性語句,您只希望此類型具有靜態和常量成員。這由編譯器強制執行,並防止您意外地向該類型添加實例方法。

其他優點

  • 擴展方法只能在靜態類中定義
  • 阻止用戶在創建類
  • 禁止使用類型爲通用參數的實例(感謝埃裏克!)
+8

它也阻止消費者創建類的一個實例。在引入靜態類之前,您必須創建一個私有的無參數構造函數來執行此操作。 – 2010-02-11 22:23:34

+0

@Joel,感謝此更新 – JaredPar 2010-02-11 22:45:14

+6

順便提一句,使一個類靜態也可以防止在泛型類,結構體,接口,委託或方法中使用該類型作爲泛型類型參數。 (你會用類型作爲泛型類型的參數來做什麼?你不能創建它,所以這個類型的變量永遠不會是非空的,你不能通過類型參數調用靜態方法。完全沒用,所以我們不允許它。) – 2010-02-11 22:47:51

6

如果您想編寫擴展方法,您必須使用靜態類。否則就是顯示該類永遠不會有任何實例數據。

1

如果您希望強制它只包含靜態方法(典型的輔助類),則標記類。如果你放置一個實例方法,編譯器會抱怨 - 這很好。在.NET框架的第1版中,有一個類,不記得哪一個類,它只是用於靜態方法。意外的是其中一種方法沒有得到靜態修飾符。因爲該錯誤在發貨後很晚才發現,因此此功能不存在。他們確實使構造函數是私有的,因此該方法無法使用。

5

這是一個特定於C#語言的約定,CLR沒有靜態類的概念。它確保您不會無意中在類中添加實例成員,無法繼承該類,並且客戶端代碼不會無意中創建該類的實例。該類的基礎TypeAttributes是Abstract和Sealed。摘要確保新操作員無法工作,Sealed確保您不能從類繼承。

同樣按照慣例,擴展方法必須是靜態類的靜態成員。 VB.NET做它不同,它需要[擴展]屬性。

在代碼中使用靜態類不是必需的,但它很有用。他們的合同非常具有描述性,它使您的代碼更易於理解。但要小心,不要將它們用作編寫程序代碼而不是OOP代碼的工具。

+0

+1用於實現細節並提及過度使用以編寫程序代碼。 – si618 2010-02-11 23:01:29

7

將班級標記爲static可以爲您帶來兩件重要的事情。

  • 編譯器驗證,您只將static成員放在一個類中。

  • 讀者對你的代碼的一個明顯的陳述是,這個類只是static成員的容器。

該功能是爲了響應NDP v1.0中的一個bug而發明的,其中a un-callable non-static member was included in the System.Environment class

+0

除此之外:我希望在類型上使用類似'readonly'的修飾符,它要求所有字段都標記爲「只讀」,並且標記爲「只讀」的類型。 NDP必須相應地註釋,尤其是原始類型。不幸的是,有大量的代碼用可變的成語編寫(例如'List ',所以爲時已晚。 – 2010-02-12 06:16:23

相關問題