Erlaubt C # 4.0 optional out
oder ref
Argumente?
c#-4.0
optional-parameters
optional-arguments
Joe Daley
quelle
quelle
null
Standardwert festgelegt habe ( ich komme aus PHP ) und getestet habenull
, um mit dem Auffüllen des Arguments fortzufahren ( für diejenigen, die vertraut sind, denken Sie nachpreg_match()
), obwohl ich dies aus technischer Sicht derzeit verstehe unmöglich, und dass PHP und C # ziemlich unvergleichlich sind, wäre es immer noch ein " schönes " Tool zur Verfügung zu haben.Antworten:
Wie bereits erwähnt, ist dies einfach nicht erlaubt und ich denke, es macht einen sehr guten Sinn. Um weitere Details hinzuzufügen, finden Sie hier ein Zitat aus der C # 4.0-Spezifikation , Abschnitt 21.1:
quelle
Nein.
Eine Problemumgehung besteht darin, mit einer anderen Methode zu überladen, die keine out / ref-Parameter hat und nur Ihre aktuelle Methode aufruft.
Update: Wenn Sie C # 7.0 haben , können Sie Folgendes vereinfachen:
(Danke @Oskar / @Reiner für den Hinweis.)
quelle
return SomeMethod(out string temp)
. Weitere Informationen finden Siereturn SomeMethod(out _);
Nein, aber eine weitere gute Alternative besteht darin, dass die Methode eine generische Vorlagenklasse für optionale Parameter wie folgt verwendet:
Dann können Sie es wie folgt verwenden:
quelle
Es gibt tatsächlich eine Möglichkeit, die von C # zugelassen wird. Dies kehrt zu C ++ zurück und verstößt eher gegen die schöne objektorientierte Struktur von C #.
VERWENDEN SIE DIESE METHODE MIT VORSICHT!
So deklarieren und schreiben Sie Ihre Funktion mit einem optionalen Parameter:
Rufen Sie dann die Funktion folgendermaßen auf:
Damit dies kompiliert werden kann, müssen Sie unsicheren Code in den Projektoptionen aktivieren. Dies ist eine wirklich hackige Lösung, die normalerweise nicht verwendet werden sollte. Wenn Sie jedoch für eine seltsame, arkane, mysteriöse, vom Management inspirierte Entscheidung WIRKLICH einen optionalen out-Parameter in C # benötigen, können Sie genau das tun.
quelle
ICYMI: In den hier aufgezählten neuen Funktionen für C # 7.0 ist "Verwerfen" jetzt als Out-Parameter in Form eines _ zulässig, damit Sie Parameter ignorieren können, die Sie nicht interessieren:
p.GetCoordinates(out var x, out _); // I only care about x
PS: Wenn Sie auch mit dem Teil "out var x" verwechselt werden, lesen Sie auch die neue Funktion zu "Out Variables" auf dem Link.
quelle
Nein, aber Sie können
Action
alternativ einen Delegaten (z. B. ) verwenden.Teilweise inspiriert von Robin Rs Antwort in einer Situation, in der ich dachte, ich wolle einen optionalen out-Parameter, habe ich stattdessen einen
Action
Delegaten verwendet. Ich habe seinen Beispielcode ausgeliehen, um ihn für die Verwendung zu ändernAction<int>
, um die Unterschiede und Ähnlichkeiten aufzuzeigen:Dies hat den Vorteil, dass die optionale Variable in der Quelle als normales int angezeigt wird (der Compiler umschließt sie in einer Abschlussklasse, anstatt sie explizit in eine benutzerdefinierte Klasse einzuschließen).
Die Variable muss explizit initialisiert werden, da der Compiler nicht davon ausgehen kann, dass die
Action
aufgerufen wird, bevor der Funktionsaufruf beendet wird.Es ist nicht für alle Anwendungsfälle geeignet, hat aber für meinen tatsächlichen Anwendungsfall gut funktioniert (eine Funktion, die Daten für einen Komponententest bereitstellt und für die ein neuer Komponententest Zugriff auf einen internen Status benötigt, der im Rückgabewert nicht vorhanden ist).
quelle
Verwenden Sie eine überladene Methode ohne den Parameter out, um die Methode mit dem Parameter out für C # 6.0 und niedriger aufzurufen. Ich bin mir nicht sicher, warum ein C # 7.0 für .NET Core überhaupt die richtige Antwort für diesen Thread ist, als speziell gefragt wurde, ob C # 4.0 einen optionalen out-Parameter haben kann. Die Antwort ist nein!
quelle
Was ist damit?
Sie müssen noch einen Wert von C # an den Parameter übergeben, dies ist jedoch ein optionaler ref-Parameter.
quelle
[Optional]
Anmerkung. Das hilft nicht.quelle