Gibt es ein IIf
Äquivalent in C #? Oder eine ähnliche Verknüpfung?
c#
.net
ternary-operator
iif-function
Saif Khan
quelle
quelle
Antworten:
C # hat den
?
ternären Operator, wie andere Sprachen im C-Stil. Dies ist jedoch nicht perfekt gleichbedeutend mitIIf()
; Es gibt zwei wichtige Unterschiede.Um den ersten Unterschied zu erklären, verursacht das Argument false-part für diesen
IIf()
Aufruf aDivideByZeroException
, obwohl das boolesche Argument lautetTrue
.IIf(true, 1, 1/0)
IIf()
ist nur eine Funktion, und wie bei allen Funktionen müssen alle Argumente ausgewertet werden, bevor der Aufruf erfolgt. Anders ausgedrückt,IIf()
schließt nicht im herkömmlichen Sinne kurz. Auf der anderen Seite schließt dieser ternäre Ausdruck kurz und ist daher vollkommen in Ordnung:(true)?1:1/0;
Der andere Unterschied
IIf()
ist nicht typsicher. Es akzeptiert Argumente vom Typ und gibt sie zurückObject
. Der ternäre Operator ist typsicher. Mithilfe der Typinferenz wird ermittelt, um welche Typen es sich handelt. Beachten Sie, dass Sie dies sehr einfach mit Ihrer eigenen generischenIIF(Of T)()
Implementierung beheben können , aber sofort ist das nicht so.Wenn Sie wirklich
IIf()
in C # wollen, können Sie es haben:object IIf(bool expression, object truePart, object falsePart) {return expression?truePart:falsePart;}
oder eine generische / typsichere Implementierung:
T IIf<T>(bool expression, T truePart, T falsePart) {return expression?truePart:falsePart;}
Wenn Sie andererseits den ternären Operator in VB verwenden möchten, stellen Visual Studio 2008 und höher einen neuen
If()
Operator bereit , der wie der ternäre Operator von C # funktioniert. Es verwendet Typinferenz, um zu wissen, was es zurückgibt, und es ist wirklich eher ein Operator als eine Funktion. Dies bedeutet, dass es keine Probleme bei der Vorbewertung von Ausdrücken gibt, obwohl diese über eine Funktionssemantik verfügen.quelle
VB.NET:
If(someBool, "true", "false")
C #
someBool ? "true" : "false";
quelle
der ternäre Operator
bool a = true; string b = a ? "if_true" : "if_false";
quelle
Ebenfalls nützlich ist der Koaleszenzoperator ??:
VB:
Return Iif( s IsNot Nothing, s, "My Default Value" )
C #:
return s ?? "My Default Value";
quelle
Beispiel:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html
quelle
Es ist der ternäre Operator
?
string newString = i == 1 ? "i is one" : "i is not one";
quelle
Es ist insofern begrenzt, als Sie dort keine Aussagen einfügen können. Sie können nur Werte (oder Dinge, die Werte zurückgeben / auswerten), zurückgeben
Dies funktioniert ('a' ist ein statisches int innerhalb der Klasse Blah)
Blah.a=Blah.a<5?1:8;
(runde Klammern stehen implizit zwischen dem Gleichheitszeichen und dem Fragezeichen).
Das funktioniert nicht.
Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er"); or Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er");
Sie können also nur den ternären Operator c # verwenden, um Werte zurückzugeben. Es ist also nicht ganz wie eine verkürzte Form eines Wenn. Mit Javascript und vielleicht einigen anderen Sprachen können Sie dort Aussagen machen.
quelle
Action
jedoch tun, was Sie wollen.iif
oder der ternäre Operator, lassen Sie einen Rückgabewert wie dort eingeben,Blah.a = Blah.a < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2;
wenn es das erlaubt, würde es funktionieren, aber anscheinend nicht. Und ja, es setzt immer noch einen Wert und nein, es ruft dort keine neue Methode auf.