[英]Static Class Vs. Class with private constructor and all static properties and methods?
當我創建實用程序類時,我通常會創建一個具有私有構造函數的類,並將其所有方法和屬性公開為static。 對此最好的方法是什么? 我的方式或創建靜態類有什么區別?
靜態類是自動密封的,因此人們無法繼承和覆蓋它們的行為。
這是唯一真正的區別(除非IL中有特殊內容)
因此,如果您使用靜態類,則可以省去將構造函數設為私有的麻煩,並聲明類密封。
我想補充說,將類定義為靜態是“自我記錄”代碼。 您的庫的用戶將知道不應該實例化此類,並且只有靜態值。
永遠不能實例化靜態類。 沒有辦法,沒有辦法。
具有私有構造函數但非所有靜態方法的非靜態類可以以各種方式濫用 - 繼承,反射,調用靜態工廠中的私有構造函數 - 來實例化類。
如果你不想要實例化,我會選擇靜態類。
編輯 - 澄清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();
}
}
現在你有一個弗蘭肯斯坦班。 它的一些功能需要實例化,有些則不需要。 也許這就是你想要的,但也許不是。 您可以通過代碼審查來防止這種情況,但為什么不在代碼中明確表達您的意圖? 將類標記為static
消除了任何可能的混淆。 您無法實例化靜態類或從中繼承。
除了之前的答案:編譯器不允許靜態類上的非靜態成員產生和錯誤。 這可能有助於一點點不會意外添加非靜態成員。
你可以將具有私有構造函數的類的對象作為參數傳遞給任何方法,但是你不能對靜態類做同樣的事情。 這是主要的區別。
此外,我將繼續使用靜態方法調用的私有構造函數。 因此,任何初始化都會浪費......但這只是一種理論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.