當我創建實用工具類時,我通常會創建一個具有私有構造函數的類,並將其所有方法和屬性公開爲靜態類。這是最好的方法是什麼?我做什麼或創建一個靜態類有什麼區別?靜態等級VS.具有私有構造函數和所有靜態屬性和方法的類?
20
A
回答
23
靜態類被自動封閉,所以人們不能繼承和重載他們的行爲。
這是唯一的真正的區別(除非有一些特別的東西在IL)
所以如果你使用一個靜態類,你救自己製作的構造私人,並宣佈密封類的麻煩。
我想補充一點,定義一個類爲static,是「自我記錄」的代碼。你的庫的用戶將知道這個類不應該被實例化,並且只有靜態值。
17
靜態類永遠不能實例化。沒辦法,沒有辦法。
非靜態類與私有構造函數,但所有的靜態方法可以以多種方式被濫用 - 繼承,反射調用私有構造的靜態工廠 - 實例化的類。
如果你永遠不想實例化,我會去靜態類。
編輯 - 澄清了FosterZ的評論
說你有這個工具類:
public class Utility
{
public static string Config1 { get { return "Fourty Two"; } }
public static int Negate(int x) { return -x; }
private Utility() { }
}
如果另一個開發人員不在其意圖明確,他們可以這樣做:
public class Utility
{
public static string Config1 { get { return "Fourty Two"; } }
public int Config2 { get; set; }
public static int Negate(int x) { return -x; }
private Utility() { }
/// Get an instance of Utility
public static Utility GetUtility()
{
return new Utility();
}
}
現在你有一個Frankenstei n級。它的一些功能需要實例化,有些則不需要。也許這就是你想要的,但也許不是。您可以通過代碼審查來防止這種情況,但爲什麼不在代碼中明確表達意圖?將課程標記爲static
可消除任何可能的混淆。您不能實例化靜態類或從中繼承。
15
除了以前的答案:編譯器將不允許在靜態類非靜態成員,併產生和錯誤。這可能會有助於不偶然地添加非靜態成員。
1
我也要去與私有構造函數永遠不會被靜態方法調用。所以在那裏的任何初始化都會浪費......但這只是一個理論。
3
可以傳遞具有私有的構造函數作爲參數傳遞給任何方法的類的對象,但你不能做同樣的靜態類。這是主要區別。
相關問題
- 1. 具有靜態方法和私有構造函數的final類?
- 2. 使用私有構造函數和私有靜態方法調用類?
- 3. 具有靜態屬性的靜態類
- 4. xUnit runner如何處理具有靜態類構造函數的靜態方法?
- 5. 具有靜態方法的靜態類和具有靜態方法的常規類之間有什麼不同?
- 6. 靜態方法改變私有屬性
- 7. Ninject和靜態構造函數方法
- 8. 具有靜態和非靜態重載的類方法
- 9. 有關靜態構造函數,方法和字段
- 10. 靜態類沒有構造
- 11. 靜態類構造函數和靜態類字段的範圍
- 12. F#私有靜態方法
- 13. iOS靜態庫私有方法和屬性
- 14. 動態創建具有構造函數的類,該構造函數調用另一個靜態類方法
- 15. Php類和構造函數內的靜態屬性
- 16. Php繼承,動態屬性和新的靜態()構造函數
- 17. 擴展,超級構造函數和靜態方法
- 18. 靜態構造函數有用
- 19. 工具類的靜態和非靜態方法的性能
- 20. 靜態構造方法vs構造函數
- 21. 類設計:公共構造函數或私有靜態工廠和COM對象
- 22. c中的私有靜態屬性
- 23. 對於具有內部創建自身的私有構造函數的類的靜態方法
- 24. 通過靜態和非靜態方法訪問靜態屬性?
- 25. 構造函數和靜態函數
- 26. Java反射 - 調用具有私有構造函數的泛型類的靜態方法
- 27. 具有參數的私有靜態方法的Java反射
- 28. 非靜態類中的靜態方法和靜態類中的靜態方法有什麼區別?
- 29. 靜態結構方法和靜態類方法有什麼區別?
- 30. MS假貨的靜態方法返回Class與私有構造
在IL中確實有一些特殊的東西。靜態類標記爲抽象和密封(這不能從C#完成),這絕對阻止了實例化。 – 2008-11-27 09:59:08
請注意,根據Mehrdad([here](http://stackoverflow.com/questions/5241899/what-is-the-difference-between-static-methods-in-a-non-static-class-and-static -me/5241927#5241927)),另一個區別是非靜態類的靜態方法不能作爲擴展方法。 – Benjol 2011-06-01 06:20:20