Laden...

[erledigt] Methoden überladen vs. Default Values - wo sind die Unterschiede?

Erstellt von blutiger_anfänger vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.798 Views
B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 11 Jahren
[erledigt] Methoden überladen vs. Default Values - wo sind die Unterschiede?

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.

S
417 Beiträge seit 2008
vor 11 Jahren

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.

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 11 Jahren

Ok, vielen Dank für die schnelle Antwort.

Viele Grüße

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

6.862 Beiträge seit 2003
vor 11 Jahren

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.

49.485 Beiträge seit 2005
vor 11 Jahren

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

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 11 Jahren

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.