在C#中,標記靜態類的目的是什麼?在C#中,標記靜態類的目的是什麼?
如果我有一個只有靜態方法的類,我可以將類標記爲靜態或不是。爲什麼我要標記類是靜態的?如果我所有的方法都是靜態的,並且如果我打算永遠不添加非靜態方法,我會不想標記靜態類嗎?
我環顧四周,看到一些類似的問題,但沒有一個像這樣。
在C#中,標記靜態類的目的是什麼?在C#中,標記靜態類的目的是什麼?
如果我有一個只有靜態方法的類,我可以將類標記爲靜態或不是。爲什麼我要標記類是靜態的?如果我所有的方法都是靜態的,並且如果我打算永遠不添加非靜態方法,我會不想標記靜態類嗎?
我環顧四周,看到一些類似的問題,但沒有一個像這樣。
將類標記爲靜態是一種聲明性語句,您只希望此類型具有靜態和常量成員。這由編譯器強制執行,並防止您意外地向該類型添加實例方法。
其他優點
它也阻止消費者創建類的一個實例。在引入靜態類之前,您必須創建一個私有的無參數構造函數來執行此操作。 – 2010-02-11 22:23:34
@Joel,感謝此更新 – JaredPar 2010-02-11 22:45:14
順便提一句,使一個類靜態也可以防止在泛型類,結構體,接口,委託或方法中使用該類型作爲泛型類型參數。 (你會用類型作爲泛型類型的參數來做什麼?你不能創建它,所以這個類型的變量永遠不會是非空的,你不能通過類型參數調用靜態方法。完全沒用,所以我們不允許它。) – 2010-02-11 22:47:51
如果您想編寫擴展方法,您必須使用靜態類。否則就是顯示該類永遠不會有任何實例數據。
如果您希望強制它只包含靜態方法(典型的輔助類),則標記類。如果你放置一個實例方法,編譯器會抱怨 - 這很好。在.NET框架的第1版中,有一個類,不記得哪一個類,它只是用於靜態方法。意外的是其中一種方法沒有得到靜態修飾符。因爲該錯誤在發貨後很晚才發現,因此此功能不存在。他們確實使構造函數是私有的,因此該方法無法使用。
這是一個特定於C#語言的約定,CLR沒有靜態類的概念。它確保您不會無意中在類中添加實例成員,無法繼承該類,並且客戶端代碼不會無意中創建該類的實例。該類的基礎TypeAttributes是Abstract和Sealed。摘要確保新操作員無法工作,Sealed確保您不能從類繼承。
同樣按照慣例,擴展方法必須是靜態類的靜態成員。 VB.NET做它不同,它需要[擴展]屬性。
在代碼中使用靜態類不是必需的,但它很有用。他們的合同非常具有描述性,它使您的代碼更易於理解。但要小心,不要將它們用作編寫程序代碼而不是OOP代碼的工具。
+1用於實現細節並提及過度使用以編寫程序代碼。 – si618 2010-02-11 23:01:29
將班級標記爲static
可以爲您帶來兩件重要的事情。
編譯器驗證,您只將static
成員放在一個類中。
讀者對你的代碼的一個明顯的陳述是,這個類只是static
成員的容器。
該功能是爲了響應NDP v1.0中的一個bug而發明的,其中a un-callable non-static
member was included in the System.Environment
class。
除此之外:我希望在類型上使用類似'readonly'的修飾符,它要求所有字段都標記爲「只讀」,並且標記爲「只讀」的類型。 NDP必須相應地註釋,尤其是原始類型。不幸的是,有大量的代碼用可變的成語編寫(例如'List
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
問你自己的問題,@dboarman! – Cheeso 2010-02-12 23:18:05
別擔心,不想污染你的問題。以爲有人可能會評論靜態成員的線程安全性。 ;) – IAbstract 2010-02-12 23:58:26