2008-11-27 149 views

回答

23

靜態類被自動封閉,所以人們不能繼承和重載他們的行爲。

這是唯一的真正的區別(除非有一些特別的東西在IL)

所以如果你使用一個靜態類,你救自己製作的構造私人,並宣佈密封類的麻煩。

我想補充一點,定義一個類爲static,是「自我記錄」的代碼。你的庫的用戶將知道這個類不應該被實例化,並且只有靜態值。

+2

在IL中確實有一些特殊的東西。靜態類標記爲抽象和密封(這不能從C#完成),這絕對阻止了實例化。 – 2008-11-27 09:59:08

+3

請注意,根據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

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

可以傳遞具有私有的構造函數作爲參數傳遞給任何方法的類的對象,但你不能做同樣的靜態類。這是主要區別。

相關問題