Ist Überladung die einzige Möglichkeit, Standardfunktionsargumente in C# zu haben?

StackOverflow https://stackoverflow.com/questions/40090

  •  09-06-2019
  •  | 
  •  

Frage

Stimmt es, dass die einzige Möglichkeit, mit Standardfunktionsargumenten umzugehen, die Funktionsüberladung ist?

In PHP kann ich zum Beispiel Folgendes tun:

function foo($x, $y=0)
{
}

Wäre dies der beste Weg, damit in C# umzugehen?

void foo(int x)
{
  foo(x, 0);
}

void foo(int x, int y)
{
}

Beispiel von hier übernommen

Bearbeiten

Habe das C#-Beispiel in echtes C# umgewandelt (Danke, Blair Conrad)

War es hilfreich?

Lösung

Ja, das wäre das Beste, es sei denn, Sie würden das weglassen $s auf den Parameternamen, wie andere bereits betont haben.Für diejenigen, die sich für die Gründe für das Fehlen von Standardparameterwerten interessieren, siehe die Erklärung von @Giovanni Galbo.

Andere Tipps

Nur um die Neugier zu befriedigen:

Aus Warum unterstützt C# keine Standardparameter?:

In Sprachen wie C++ kann ein Standardwert als Teil der Methodendeklaration eingefügt werden:

void Process(Employee Employee, bool Bonus = false)

Diese Methode kann entweder aufgerufen werden mit:

a.Process(employee, true);

oder

a.Prozess(Mitarbeiter);

im zweiten Fall wird der Parameter Bonus auf false gesetzt.

C# verfügt nicht über diese Funktion.

Ein Grund, warum wir diese Funktion nicht haben, hängt mit einer bestimmten Implementierung der Funktion zusammen.Wenn der Benutzer in der C++-Welt schreibt:

a.Prozess(Mitarbeiter);

Der Compiler generiert

a.process(employee, false);

Mit anderen Worten: Der Compiler nimmt den im Methodenprototyp angegebenen Standardwert und fügt ihn in den Methodenaufruf ein – es ist, als ob der Benutzer „false“ als zweiten Parameter geschrieben hätte.Es gibt keine Möglichkeit, diesen Standardwert zu ändern, ohne den Benutzer der Klasse zu einer Neukompilierung zu zwingen, was bedauerlich ist.

Das Überlastungsmodell funktioniert in dieser Hinsicht besser.Der Framework-Autor definiert lediglich zwei separate Methoden, und die Methode mit einem Parameter ruft die Methode mit zwei Parametern auf.Dadurch bleibt der Standardwert im Framework erhalten, wo er bei Bedarf geändert werden kann.

Es wäre für einen Compiler möglich, so etwas wie die C++-Definition zu übernehmen und die Überladungen zu erzeugen, aber es gibt ein paar Probleme bei diesem Ansatz.

Der erste Grund besteht darin, dass die Korrelation zwischen dem Code, den der Benutzer schreibt, und dem Code, den der Compiler generiert, weniger offensichtlich ist.Wir versuchen im Allgemeinen, Magie nach Möglichkeit einzuschränken, da sie es für Programmierer schwieriger macht.Das zweite Problem betrifft Dinge wie XML-Dokumentkommentare und Intellisense.Der Compiler müsste spezielle Regeln dafür haben, wie er Dokumentkommentare für die überladenen Methoden generiert, und Intellisense müsste über intelligente Funktionen verfügen, um die überladenen Methoden in einer einzigen Methode zusammenzufassen.

Überladungen selbst zu schreiben ist etwas weniger praktisch, aber wir halten es für eine akzeptable Lösung.

Bezüglich der Auszug aus der C#-FAQ:

Die meisten der dort aufgeführten Probleme wurden für VB.Net gelöst (insbesondere die Intellisense- und XML-Kommentarprobleme), was bedeutet, dass es sich wirklich um Ablenkungsmanöver handelt – Dem C#-Team steht Code zur Verfügung, der das Problem lösen kann.

Ein weiterer Grund hat damit zu tun, dass ein Benutzer einer Klasse zum erneuten Kompilieren gezwungen wird, aber auch das ist eine Art Ablenkungsmanöver.Wenn du ändern einen Standardwert in Ihrer Framework-Klasse und der Benutzer tut dies nicht Wenn Sie neu kompilieren müssen, riskieren Sie den Benutzer Ich weiß nicht, dass sich der Standardwert geändert hat. Jetzt liegt ein potenzieller Fehler im Code vor, der erst zur Laufzeit auftritt.Mit anderen Worten: Die Alternative, die Funktion zu überladen, ist mindestens genauso schlecht.Dies setzt natürlich auch eine konkrete Implementierung der Funktion voraus, aber es handelt sich um die in der FAQ vorgeschlagene Implementierung.

Daher müssen Sie den verbleibenden Grund („versuchen, die Magie einzuschränken“) gegen die Tatsache (die sie anerkennen) abwägen, dass das Schreiben der Überladungen „etwas weniger bequem“ ist.Persönlich würde ich sagen: Integrieren Sie die Funktion und lassen Sie den Programmierer entscheiden, ob er sie verwendet oder nicht.

Standardargumente sind Teil von C++, aber ab C# 3.5 werden Standardargumente immer noch nicht unterstützt – Sie müssen überladen.Sie sind seit 1.0 in VB.Net verfügbar.

Ja.

Oder Curry.

Oder in eine Klasse abstrahieren und dort Standardwerte verwenden.

Nein, AFAIK C# unterstützt kein Überschreiben, und ja, das ist die empfohlene Methode, um den gleichen Effekt zu erzielen.

Wie bereits erwähnt, ist dies derzeit nicht in C# verfügbar, sie werden jedoch in C# 4.0 vorhanden sein, wie Sam Ng in seinem Blog erläutert:

http://blogs.msdn.com/samng/archive/2009/02/03/named-arguments-optional-arguments-and-default-values.aspx

Funktioniert das nicht?

void foo(int x):this(x, 0){}

void foo(int x, int y){
 // code here
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top