Laden...

Optionale Parameter (ab C# 4.0)

Erstellt von Mighty Panther vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.678 Views
Mighty Panther Themenstarter:in
22 Beiträge seit 2008
vor 15 Jahren
Optionale Parameter (ab C# 4.0)

Hallo!

Ab C# 4.0 soll es wie in C++ möglich sein, optionale Parameter für eine Methode, recht einfach, festzulegen.


public void Foo(string s = "Hallo Welt")
{
   Console.WriteLine(s);
}

public void Test()
{
   Foo();              // out: Hallo Welt
   Foo("Hallo Bernd"); // out: Hallo Bernd
}

Nun habe ich schon folgende Methoden gesehen, die quasi auch optionale Parameter haben (soll).


public void Foo([Optional, DefaultParameterValue(null)]string myOptionalParameter1, [Optional, DefaultParameterValue(null)]string myOptionalParameter2)
{
}

Aber wenn ich diese Methode bei mir zum testen implementiere, dann bekomme ich vom Compiler eine Fehlermeldung, wenn ich nicht beide Parameter angebe.

Kann mir da jemand weiter helfen?
Ich weiß, dass man das auch durch überladen von Methoden machen kann, aber die o.g. Möglichkeit interessiert mich einfach bzw. wieso funktioniert sie nicht bei mir.

THX & LG
Mighty

PS: Hier habe ich auch ein Beispiel gefunden.
(hier klicken)

F
10.010 Beiträge seit 2004
vor 15 Jahren

Du benutzt auch VS.NET 2010?

Denn erst da ist der C#4 Compiler drin.

1.361 Beiträge seit 2007
vor 15 Jahren

Hi Panther,

wie du schon erwähnt hast, kennt C# (vor Version 4) noch keine optionalen Parameter. Allerdings gibt es dieses Konzept innerhalb der CIL. (Deshalb gibs das ja auch in VB und C++ - jeweils die .Net version)

Du kannst zwar mit diesem Attributen den passenden IL-Code für eine Methode mit optionalem Parameter erstellen. Aber aus C# heraus kannst du das dann nicht so nutzen wie geplant. Eben weil auch der Compiler das nicht kennt.

Was als Workaround geht, ist das hier:



public void Test()
{
   Foo(
    (string)this.GetType().GetMethod("Foo").GetParameters()[0].DefaultValue,
    (string)this.GetType().GetMethod("Foo").GetParameters()[1].DefaultValue
  );
}

nicht schön aber selten 😃

beste Grüße
zommi

Mighty Panther Themenstarter:in
22 Beiträge seit 2008
vor 15 Jahren

Danke für eure Antworten.
Ich nutze VS 2008 und da wird wohl auch "der Hund begraben sein".

THX & LG
Mighty

T
574 Beiträge seit 2008
vor 15 Jahren

*kopfschüttel*

104 Beiträge seit 2004
vor 15 Jahren

C# unterstürtzt auch ein Konzept namens Überladung - Das sollte in dem Zusammenhang vielleicht auch nochmal erwähnt werden.

Schaut mal im IRC vorbei:
Server: irc.euirc.net
Channel: #C#

3.971 Beiträge seit 2006
vor 15 Jahren

Zu beachten sind auch die Nachteile von optionalen Parametern:
The Future of C# (C# 4.0) (und auch die Beiträge zuvor!)

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

1.346 Beiträge seit 2008
vor 15 Jahren

Wenn ich an optionale Parameter denke, denke ich immer an VB. Als ich damals auf C# umgestiegen bin, habe ich sieh nicht vermisst. Sie machen eigendlich genau das selbe wie eine Überladung. Ich brauche sie nicht. So viel mehr Schreibarbeit ist eine Überladung ja auch nicht.

Gruß pdelvo

4.942 Beiträge seit 2008
vor 15 Jahren

Also ich finde optionale Parameter schon sinnvoll, anstatt davon die entsprechende Menge an Überladungen bereitzustellen.

Was die Umsetzung davon angeht (sowhl bei C++ als auch bei C# 4.0) darüber kann man sicherlich geteilter Meinung sein.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Th69,

richtig, es ist eine Frage der Umsetzung, ob die Nachteile enstehen, nicht der Syntax als solche. Die Optionale-Parameter-Syntax könnte der Compiler intern einfach in die entsprechenden Überladungen umsetzen. Dann wäre die Optionale-Parameter-Syntax lediglich eine Abkürzung zum Definieren von Überladungen und alles würde weiterhin so laufen wie bisher. Die Syntax ist also erstmal wertfrei. Die Umsetzung macht's.

herbivore

3.971 Beiträge seit 2006
vor 15 Jahren

Allerdings besteht auch die Gefahr bei Überladungen. Eine Funktion mit weniger Argumenten ruft in vielen Fällen auch nur eine andere Überladung auf und übergibt Standardwerte. Wird dieser Wert beispielsweise auch geändert, kracht es genauso.

Was ich bei optionalen Parametern als einziges toll finde, sind die benannten Parameter. Bei Funktionen mit vielen Parametern und nur einfachen Datentypen, sieht man direkt, welcher Wert an welchen Parameter übergeben wird.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo kleines_eichhoernchen,

vorsichtig muss man so oder so sein. Aber wenn die Umsetzung so wäre, wie von mir beschrieben, würden nur Vorteile gegenüber dem manuellen Erstellen vom Überladungen bestehen (weniger Tipparbeit, gleiches Ergebnis). Anderseits ist es müssig, diese Diskussion zu führen, weil wir eh keinen Einfluss darauf haben, wie es umgesetzt wird.

Benannte Parameter finde ich auch interessant. Ob die dann auch den Praxistest bestehen, weiß ich natürlich noch nicht.

herbivore

104 Beiträge seit 2004
vor 15 Jahren

Hallo,

in folgendem Artikel wird die Funktionsweise der optionalen Parameter beschrieben, wie auch Vor- und Nachteile im Vergleich zu Überladungen diskutiert.

Optionale Parameter

Anscheinend werden optionale Parameter nicht über die automatische Generierung von Überladungen realisiert (Was auch ein Problem bei mehreren optionalen Folgeparametern des selben Typs wäre).

Statt dessen werden die Werte vom Compiler zu Begin der Methode gesetzt (Wenn ich das richtig verstanden habe).

Dieser C#-Code:


private void Test([Optional, DefaultParameterValue(12)] int i)
{
}

würde dann zu folgendem IL-Code werden:


.method private hidebysig instance void Test([opt] int32 i) cil managed 
{
    .param [1] = int32(0x0000000C)
    .maxstack 8
    L_0000: nop
    L_0001: ret
}

Grüße

Schaut mal im IRC vorbei:
Server: irc.euirc.net
Channel: #C#