2012-11-06 16 views
9

Szukałem tego dużo, ale żadna z odpowiedzi nie jest jasna (przynajmniej dla mnie!). Teraz umieszczam to pytanie w SO, ponieważ uważam, że nigdzie indziej nie mogę uzyskać bardziej klarownej odpowiedzi.Konstruktory prywatne i statyczne w .Net

Kiedy należy używać prywatnego/statycznego konstruktora w mojej klasie?

Mam dość zwykłych odpowiedzi, więc proszę o pomoc w kilku przykładach w czasie rzeczywistym i zaletach/wadach korzystania z tych konstruktorów.

+4

Konstruktor prywatny - jeśli nie chcesz, aby obiekt można było skonstruować spoza bieżącej klasy. Konstruktor statyczny - jeśli musisz zainicjować stan klasy statycznej. – zerkms

Odpowiedz

17

Statyczne konstruktory: używane do inicjowania statycznych elementów.

Konstruktory prywatne: używane, gdy chcesz utworzyć instancję klasy tylko we własnym kodzie (zwykle w metodzie statycznej). Na przykład:

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

W ten sposób można zaimplementować wzorzec fabryczny - np. Jeśli posiadasz obiekty biznesowe, które muszą znajdować się w określonym "stanie", ale chcesz uniemożliwić osobom trzecim/innym programistom zainicjowanie ich przy użyciu publicznego konstruktora, możesz uczynić konstruktor prywatnym i dostarczyć zestaw fabrycznych metod tworzenia/odbierania obiektów. W ten sposób nie mogą uzyskać "pustego" obiektu bezstanowego przez konstruktora (chyba, że ​​naprawdę chcą np. Odbić). – Charleh

+1

Statyczny konstruktor może być również użyty do wywołania prywatnego konstruktora, który z kolei tworzy instancję prywatną statycznego elementu zawierającego typ klasy. Niż statyczna funkcja/właściwość może po prostu zwrócić ten element, więc zawsze istnieje tylko jedno wystąpienie takiego obiektu - singleton. – jwaliszko

3

Statyczny konstruktor służy do intialize statycznych członków klasy i jest wywoływana, gdy pierwsza instancja klasy jest tworzony lub członek statyczny jest dostępny po raz pierwszy.

prywatny konstruktor jest używany, jeśli masz przeciążeń konstruktora, a niektóre z nich powinny być używane tylko przez innych konstruktorów

8

Kiedy należy używać prywatny konstruktor w klasie?

Kiedy chcesz konstruktora, ale nie chcesz go wystawiać na świat. Może to być spowodowane tym, że masz fabryczną metodę, która wywołuje konstruktor (po sprawdzeniu poprawności), lub ponieważ ten konstruktor jest wywoływany przez łańcuchowanie łańcucha (to jest public Foo(string) : this() { ...}).

Należy pamiętać, że kod odbicia często może korzystać z prywatnego konstruktora - na przykład serializacji lub bibliotek ORM.

Również na wczesnych kompilatorach C#, gdy piszesz, co teraz będzie klasą static - posiadanie prywatnego konstruktora było jedynym sposobem uczynienia go nieuleczalnym.

Kiedy należy używać statycznego konstruktora w mojej klasie?

Gdy zachodzi potrzeba zainicjalizowania jakiegoś statycznego stanu przed uzyskaniem dostępu do tego stanu przez instancje lub metody statyczne.