Sie müssen berücksichtigen, dass der Compiler einen Standardkonstruktor für Sie generiert, wenn Sie keinen überladenen Konstruktor bereitstellen. Das heißt, wenn Sie nur haben
public class Foo
{
}
Der Compiler generiert dies wie folgt:
public class Foo
{
public Foo() { }
}
Sobald Sie jedoch den anderen Konstruktor hinzufügen
public class Foo
{
public Foo(int x, int y)
{
}
}
Der Compiler generiert den Standardkonstruktor nicht mehr automatisch für Sie. Wenn die Klasse bereits in einem anderen Code verwendet wurde, der auf dem Vorhandensein eines Standardkonstruktors beruhte Foo f = new Foo();
, würde dieser Code jetzt beschädigt.
Wenn Sie nicht möchten, dass jemand die Klasse ohne Angabe von Daten initialisieren kann, sollten Sie einen Standardkonstruktor erstellen private
, der explizit darauf hinweist, dass Sie verhindern, dass Instanzen ohne Eingabedaten erstellt werden.
Es gibt jedoch Situationen, in denen ein Standardkonstruktor (öffentlich oder privat) bereitgestellt werden muss. Wie bereits erwähnt, erfordern einige Serialisierungstypen einen Standardkonstruktor. Es gibt auch Zeiten, in denen eine Klasse mehrere parametrisierte Konstruktoren hat, aber auch eine Initialisierung auf "niedrigerer Ebene" erfordert. In diesem Fall kann ein privater Standardkonstruktor verwendet werden, der von den parametrisierten Konstruktoren verkettet wird.
public class Foo
{
private Foo()
{
}
public Foo(int x, int y)
: this()
{
}
public Foo(int x, int y, int z)
: this()
{
}
}