2015-05-19 49 views
0

我只想知道靜態構造函數和私有構造函數的主要區別。靜態構造函數和私有構造函數之間的主要區別是什麼?

我知道靜態構造函數用於初始化類的靜態成員。靜態構造函數不能訪問非靜態成員。它在一個類的第一個實例之前執行。我們無法確定執行的時間。靜態構造函數由CLR而不是由類的對象執行。沒有參數化的靜態構造函數,因爲它由CLR處理而不是由對象處理。執行時間可能在加載包含的程序集。

但是,私人構造函數用於限制一個類被實例化並被繼承。每當一個類只包含靜態成員時,就使用Private構造函數。

除此之外,這兩者在內存使用情況和其他方面有什麼區別?應該使用哪個?

+2

「私有構造函數是用來當一個類僅包含靜態成員」 - 這是完全錯誤的,你是混合的東西了。 「私人構造函數用於限制一個類被實例化並被繼承」 - 這甚至意味着什麼*? – Mints97

+3

爲什麼像寫字檯一樣的烏鴉? – dasblinkenlight

+3

@dasblinkenlight寫字檯是筆的休息區,烏鴉是w pe的害蟲。 – Kapol

回答

4

私人構造函數仍然是實例構造函數 - 它們不是靜態的。它們與公共構造函數沒有區別,只是它們定義誰可以調用它們,就像公有和私有常規方法之間的區別。

私有構造函數的一些可能的用例將用於單例,一個私有構造函數的功能被多個公共構造函數共享,或者使用靜態方法構建您的類而不是構造函數。

public class Bar { 
    private Bar() { } 
    private static readonly Bar _instance = new Bar(); 
    public static Bar GetInstance() { return _bar; } 
} 

public class Baz { 
    private string _msg; 
    private Baz(string msg) { // Not accessible publicly 
     _msg = msg; 
    } 

    // These two are accessible publicly, and both call 
    // the private constructor 
    public Baz(int i) : this(i + " is an integer") { } 
    public Baz(decimal d) : this(d + " is a decimal") { } 
} 

public class Foo { 
    private Foo() { // Not accessible publicly 
    } 
    public static Foo CreateFoo() { 
     // Do some stuff here that you can't normally do in a constructor. 
     return new Foo(); 
    } 
} 
+1

謝謝Joe回答。這回答我的問題。至少你是在回答問題,而不是批評我的問題。 – Yash

+1

沒有問題。在靜態類之前(我認爲是C#2.0),實用類的常見模式是創建一個只有私有構造函數的抽象類,那麼裏面的所有方法都是靜態的。你偶爾會看到這種模式 - 可能是混淆的一部分。 –

1

如果您正在使用私有構造函數來抑制與僅包含靜態成員的類自動生成的公共構造...考慮,而不是使用類本身static關鍵字,以防止任何實例:

public static class MyMethods 
{ 
    public static void Go() 
    { 
///TODO 
    } 
} 
+0

私有構造函數的目的不是爲了防止任何實例化,而是爲了防止任何* external *實例化,同時允許* internal *實例化,這是'static'不允許的。 – Servy

+1

是的,在類級別靜態關鍵字的目的是防止任何實例化。我們似乎一致。 –

+0

@Servy,並不是所有的語言都有static關鍵字,因此Yash對使用私有構造函數來防止靜態類的實例可能源自於使用其他語言的技巧感到困惑。 –

相關問題