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)
Du benutzt auch VS.NET 2010?
Denn erst da ist der C#4 Compiler drin.
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
Danke für eure Antworten.
Ich nutze VS 2008 und da wird wohl auch "der Hund begraben sein".
THX & LG
Mighty
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#
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...
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
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.
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
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...
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
Hallo,
in folgendem Artikel wird die Funktionsweise der optionalen Parameter beschrieben, wie auch Vor- und Nachteile im Vergleich zu Überladungen diskutiert.
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#