Sollten wir immer einen Standardkonstruktor in die Klasse aufnehmen?
Ich wurde gebeten, diese Frage von einem Kollegen, sollten wir immer einen default-Konstruktor in einer Klasse? Wenn ja, warum? Wenn Nein, warum nicht?
Beispiel
public class Foo {
Foo() { }
Foo(int x, int y) {
...
}
}
Ich bin auch daran interessiert zu bekommen einige Lichter auf diesem von Experten.
Kommentar zu dem Problem
Wie gewohnt - nur wenn es notwendig ist.
Ja, ich bin auch neugierig. Mein manager sagt immer zu mir, dass es notwendig für die Reflexion, aber ich konnte nicht google nichts dazu, so bin ich ein wenig verwirrt.
InformationsquelleAutor der Frage Moon | 2010-09-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie im Auge zu behalten, dass, wenn Sie nicht einen überladenen Konstruktor, erzeugt der compiler einen default-Konstruktor für Sie. Das bedeutet, dass, wenn Sie nur
Erzeugt der compiler dies als:
Jedoch, sobald Sie die anderen Konstruktor
Wird der compiler nicht mehr automatisch die default-Konstruktor für Sie. Wenn die Klasse wurde bereits in anderen code, stützte sich auf das Vorhandensein eines default-Konstruktor
Foo f = new Foo();
würde, dass code jetzt Pause.Wenn Sie nicht möchten, dass jemand in der Lage sein zu initialisieren die Klasse, ohne die Bereitstellung von Daten erstellen Sie einen default Konstruktor, wird
private
explizit über die Tatsache, dass Sie verhindern, dass Instanzen aus gebaut mit no-input-Daten.Gibt es Zeiten, wenn es jedoch notwendig ist, um einen default-Konstruktor (ob öffentlich oder privat). Wie schon zuvor erwähnt, einige Arten von Serialisierung erfordern einen default-Konstruktor. Es gibt auch Zeiten, wenn eine Klasse mehrere parametrisierte Konstruktoren aber auch eine "untere Ebene" der Initialisierung, in dem Fall ein privater default-Konstruktor verwendet werden, die angekettet in der aus den parametrisierten Konstruktoren.
InformationsquelleAutor der Antwort Scott Dorman
Einige Dinge (wie serialisieren) benötigen einen Standard-Konstruktor. Außerhalb der, dass, jedoch, ein Standard-Konstruktor darf nur Hinzugefügt werden, wenn es Sinn macht.
Zum Beispiel, wenn die
Foo.X
undFoo.Y
Eigenschaften sind unveränderlich nach dem Bau dann die default-Konstruktor nicht wirklich sinnvoll. Auch wenn es für einen "leeren" Foo, eine statischeEmpty
accessor wäre mehr auffindbar.InformationsquelleAutor der Antwort Richard Szalay
Ich würde sagen keine, definitiv nicht immer. Angenommen, Sie haben eine Klasse mit einigen readonly-Felder initialisiert werden müssen, um einen gewissen Wert, und es gibt keine sinnvolle Voreinstellungen (oder Sie nicht wollen, es zu werden)? In diesem Szenario glaube ich nicht, dass parameterlosen Konstruktor sinnvoll.
InformationsquelleAutor der Antwort Dan Tao
Dass ein default-Konstruktor ist nur eine gute Idee, wenn es sinnvoll ist, ein solches Objekt.
Wenn Sie erzeugen ein Objekt, das nicht in einem gültigen Zustand aus wie ein Konstruktor, dann ist die einzige Sache, die Sie tun können, ist die Einführung eines bug.
InformationsquelleAutor der Antwort Jon Hanna
Als eine Randnotiz, bei der Verwendung von struct statt der Klasse, beachten Sie, dass es keine Möglichkeit lassen Sie die Standard-Konstruktor aus, noch ist es möglich zu definieren, es sich selbst, also unabhängig davon, welche Konstruktoren definieren Sie, stellen Sie sicher, dass der default-Zustand der Struktur struct (wenn alle Variablen auf Ihren default-Zustand (in der Regel 0 für value-Typen und null für Referenztypen) wird nicht brechen Ihrer Umsetzung der struct.
InformationsquelleAutor der Antwort Øyvind Bråthen
Ja, Es ist besser, einen Standard-Konstruktor in Ort, um sicherzustellen, dass Sie keine Verwirrung. Ich habe Leute gesehen, die einfach nur nichts tun im inneren ein Standard-Konstruktor (auch in Microsoft ' s eigene Klassen) aber immer noch, wie es zu halten, als Objekte bekommen standardmäßig(Typ) automatisch. Die Klassen, die nicht angeben, der default-Konstruktor .NET wird automatisch fügen Sie Sie für Sie.
Serialisierung muss Standard-Konstruktor, wenn Sie vorhandene serialisierungsprogramme da macht es Sinn, für Allgemeine Zwecke serialisierungsprogramme, sonst müssen Sie erstellen Ihre eigene Implementierung.
InformationsquelleAutor der Antwort abhishek
In den meisten Fällen wird ein Standard-Konstruktor ist eine gute Idee. Aber da du das Wort "immer", alles, was Sie brauchen, ist ein Gegenbeispiel. Wenn Sie sich den Rahmen anschauen, finden Sie viele. Zum Beispiel, System.Web.HttpContext.
InformationsquelleAutor der Antwort Joe
Einen generischen Typ kann nur instanziiert werden, die mit C# - Mitteln (ohne Reflexion), wenn es einen default-Konstruktor. Auch die
new()
generischen Typ-constraint angegeben werden:Aufruf dieser Methode mit einem Typ als generischer Typ-argument, das hat keinen default-Konstruktor führt zu einem compiler-Fehler.
InformationsquelleAutor der Antwort Olivier Jacot-Descombes