2010-05-20 20 views
39

Gibt es eine Möglichkeit, die Verwendung des Standardkonstruktors zu verhindern?Verwendung des Standardkonstruktors verhindern

Alles, was ich denken kann, ist eine Ausnahme auszulösen, aber ich möchte etwas, das einen Kompilierzeitfehler verursacht.

+3

Sie in Schwierigkeiten geraten können, wenn Sie dies tun: (. Bindung/Serialisierung/etc) In .NET ein Standard-parameterlosen Konstruktor für eine Reihe von Dingen notwendig ist. Berücksichtigen Sie Standardwerte für alle Werte, die Sie über Konstruktorparameter festlegen müssen. In Ihrem Fall spielt das keine Rolle, aber es ist erwähnenswert. –

Antwort

80
  • Wenn alles in der Klasse statisch ist, sollten Sie eine statische Klasse erstellen. Auf diese Weise erhalten Sie keinen Konstruktor.
  • Wenn Sie einen parameterlosen Konstruktor wollen, aber Sie wollen es nicht öffentlich sein, es ausdrücklich zu erklären und es privat machen (oder interne etc)
  • Wenn Sie nicht über einen parameterlosen Konstruktor wollen aber Bauer wollen tun mit Parametern, dann erklären nur diejenigen - die Standard-Konstruktor wird nicht für dich ichdenken

erzeugt werden, die alle Grundlagen abdecken sollte ...

+0

Du hast ziemlich genau gesagt, was ich gerade tippte :) – Joel

+0

Ich wünschte, ich wüsste schon lange über statische Klassen. – luiscubal

+1

es sei denn, es ist eine Struktur und keine Klasse. Wenn dies der Fall ist, wird der Standard-CTor generiert (eine gute Sache, so dass alle Props initialisiert werden), aber aufrufbar (leider) - d. H. Ich möchte den Benutzer zwingen, den CTor mit Params zu verwenden. –

35

Machen Sie es privat.

So

class SomeClass 
{ 
    private SomeClass() 
    { 
    } 

    public SomeClass(int SomeParam) 
    { 
    } 
} 
+0

+1 für den Punkt. – corsiKa

+9

Sofern Sie es nicht innerhalb des Typs (oder geschachtelter Typen) benötigen, können Sie es hier vollständig entfernen - es wird nur generiert, wenn keine Konstruktoren explizit deklariert sind. –

+0

@Jon Ich bin normalerweise ein Gürtel und Hosenträger Art von Kerl, also würde ich es normalerweise auf diese Weise tun; auf diese Weise ist das, was ich versuche, jedem klar, der es ansieht. Gut zu wissen, dass es vom Compiler automatisch erledigt wird, wenn ich es vergesse. –

8

Sie können einfach es privat machen:

private MyClass() 
{ 
} 

Alternativ (wenn Sie nicht bereits wissen), wenn Sie nur einen Konstruktor mit Parametern deklarieren, ist der Standard ein isn 't vom Compiler hinzugefügt, z

private MyClass(string myParameter) 
{ 
    //Can't call new MyClass() anymore 
} 
5

Eine Sache zu erwähnen, dass andere nicht haben. Der Standardkonstruktor sollte weiterhin in der Lage sein, die Standardimplementierungsbits einzurichten, um eine Wiederverwendung zu vermeiden. Dies ist kein Problem, wenn es privat ist, da Sie immer noch zu einem privaten Konstruktor verketten können. Sie machen es nur für externe Quellen verfügbar.

private MyClass() 
{ 
} 

public MyClass(string something) : this() 
{ 
} 

Das löst das Problem. Beachten Sie jedoch, dass protected möglicherweise eine bevorzugte Implementierung ist, wenn die Klasse nicht versiegelt ist.

1

Neben anderen Antworten können Sie folgenden Text lesen , für weitere Informationen über Singleton Muster und einige Beispiele. Das Singleton-Muster beruht darauf, dass der Konstruktor privat ist.

http://www.yoda.arachsys.com/csharp/singleton.html

Verwandte Themen