Hallo,
ich habe eine Verständnisfrage. Ich bin letztens über Default Values in Konstruktoren gestolpert und Frage mich jetzt, wo der Unterschied zwischen der Variante mit Überladungen:
class Test
{
private int _a;
public int A { get { return _a; } set { _a = value; } }
public Test()
{
this._a = 0;
}
public Test(int a)
{
this._a = a;
}
}
und der Variante mit Default Value:
class Test
{
private int _a;
public int A { get { return _a; } set { _a = value; } }
public Test(int a = 0)
{
this._a = a;
}
}
ist?
Gibt es dort Unterschiede im Verhalten, die ich beachten muss? Oder stehen beide Varianten vom Verhalten her analog zueinander? Wenn ja, dann wäre ja die Variante mit Default Value aufgrund ihrer Länge zu bevorzugen.
Viele Grüße,
Raffi
Wenn ich nicht hier bin, findest du mich auf code-bude.net.
Hallo,
eigentlich müsstest du dich in der 1. Variante auf den anderen Konstruktor stützen, um Redundanzen zu vermeiden:
public Test()
: this(0)
{}
public Test(int a)
{
this._a = a;
}
Bei der Default-Value Variante kommt hinzu, dass dem Aufrufer bekannt gemacht wird, was genau der Default-Wert ist, falls explizit keiner angebeben wird.
Ok, vielen Dank für die schnelle Antwort.
Viele Grüße
Wenn ich nicht hier bin, findest du mich auf code-bude.net.
Hallo,
Oder stehen beide Varianten vom Verhalten her analog zueinander?
Wenn du nur den Konstruktor mit einem Argument benutzt, sind sie relativ gleich, im zweiten Fall gibts aber keinen Standardkonstruktor und das ist nen riesen Unterschied zum ersten Fall.
Man muss auch auf das Laufzeitverhalten aufpassen. Defaultwerte werden bei der Kompilierung reinkompiliert. Wenn man Assembly A hat mit z.B. deinen Konstruktor und Assembly B wo ihn benutzt, dann kompiliert man A mit z.B. 0 als Defaultwert, kompiliert B, ändert den Wert auf A in 5 und wenn man jetzt das Programm ausführt, fällt man auf die Nase, da B immer noch von 0 ausgeht, und nicht von dem aktuellen Wert.
Baka wa shinanakya naoranai.
Mein XING Profil.
Hallo blutiger_anfänger,
neulich hatten wir eine recht ähnliche Frage: Konstruktorredundanz in Ordnung?
Früher gab es Default Parameter gar nicht, und das aus gutem Grund, siehe Default Werte für Parameter.
Generell ist die landläufige Meinung, dass man mit Überladungen auf der sicheren Seite und gleichzeitig flexibler ist, um den Preis von etwas mehr Code.
Das wurde schon mehrfach im Forum besprochen. Über die Suche findest du entsprechende Threads, z.B. The Future of C# (C# 4.0).
Zudem ist die ganze Frage schon ziemlich nah an [Hinweis] Wie poste ich richtig? Punkt 1.1.1.
herbivore
Hallo herbivore,
auch noch mal Danke für deine Antwort. Was das richtige Posten angeht, habe ich anscheinend die falschen Begriffe in die Suche gehauen. Das tut mir leid.
Viele Grüße
Wenn ich nicht hier bin, findest du mich auf code-bude.net.