2012-11-06 6 views
9

Ich suchte nach einer Menge, aber keine der Antworten sind klar (zumindest für mich!). Jetzt stelle ich diese Frage in SO, da ich glaube, dass ich nirgendwo anders eine klarere Antwort bekommen kann.Private vs Statische Konstruktoren in. Net

Wann sollte ich einen privaten/statischen Konstruktor in meiner Klasse verwenden?

Ich habe die üblichen Antworten satt, also bitte helfen Sie mir mit einigen Echtzeit-Beispielen und Vor- und Nachteilen der Verwendung dieser Konstruktoren.

+4

Privater Konstruktor - wenn Sie nicht möchten, dass Ihr Objekt außerhalb der aktuellen Klasse konstruierbar ist. Statischer Konstruktor - wenn Sie den Status der statischen Klasse initialisieren müssen. – zerkms

Antwort

17

Statische Konstruktoren: werden zur Initialisierung statischer Elemente verwendet.

Private Konstruktoren: Wird verwendet, wenn Sie nur eine Klasse innerhalb ihres eigenen Codes instanziieren möchten (normalerweise in einer statischen Methode). Zum Beispiel:

public class Thing 
{ 
    static int Number; 

    static Thing() 
    { 
     Number = 42; // This will only be called once, no matter how many instances of the class are created 
    } 

    // This method is the only means for external code to get a new Thing 
    public static Thing GetNewThing() 
    { 
     return new Thing(); 
    } 

    // This constructor can only be called from within the class. 
    private Thing() 
    { 
    } 
} 
+4

Sie können das Factory-Muster auf diese Weise implementieren - dh wenn Sie Business-Objekte haben, die sich in einem bestimmten 'Status' befinden müssen, aber Sie verhindern wollen, dass Drittanbieter/andere Devs sie mit dem öffentlichen Konstruktor initialisieren, können Sie den Konstruktor privat machen und bieten eine Reihe von Factory-Methoden zum Erstellen/Abrufen der Objekte. Auf diese Weise können sie durch Konstruktor kein statusloses Objekt "leer" erhalten (es sei denn, sie möchten z. B. eine Reflektion). – Charleh

+1

Statischer Konstruktor kann auch zum Aufrufen eines privaten Konstruktors verwendet werden, der seinerseits ein privates statisches Element des enthaltenen Klassentyps instanziiert. Als statische Funktion/Eigenschaft kann nur dieses Member zurückgeben, also gibt es immer nur eine Instanz eines solchen Objekts - ein Singleton. – jwaliszko

3

statischer Konstruktor wird verwendet, um die statischen Elemente der Klasse zu initialisieren und wird aufgerufen, wenn die erste Instanz der Klasse erzeugt wird, oder ein statisches Element ist zum ersten Mal abgerufen.

privaten Konstruktor wird verwendet, wenn Sie Überlastungen des Konstrukteurs haben, und einige von ihnen sollten nur von den anderen Konstrukteuren verwendet werden

8

Wann sollte ich einen privaten Konstruktor in meiner Klasse verwenden?

Wenn Sie einen Konstruktor wollen, aber nicht der Welt aussetzen wollen. Dies kann daran liegen, dass Sie eine Factory-Methode haben, die den Konstruktor aufruft (nach der Validierung), oder weil dieser Konstruktor von ctor-chaining aufgerufen wird (d. H. public Foo(string) : this() { ...}).

Beachten Sie außerdem, dass der Reflection-Code häufig einen privaten Konstruktor verwenden kann - z. B. Serialisierungs- oder ORM-Bibliotheken.

Auch in frühen C# -Compilern, wenn Sie schreiben, was wäre jetzt eine static Klasse - mit einem privaten Konstruktor war der einzige Weg, um es unreatable erscheinen.

Wann sollte ich einen statischen Konstruktor in meiner Klasse verwenden?

Wenn Sie einen statischen Zustand initialisieren müssen, bevor auf diesen Zustand von Instanzen oder statischen Methoden zugegriffen wird.