Gibt es eine IIf
-Entsprechung in C#
? Oder eine ähnliche Abkürzung?
C # hat wie andere C-Sprachen den ternären Operator ?
. Dies ist jedoch nicht vollkommen äquivalent zu IIf()
; Es gibt zwei wichtige Unterschiede.
Um den ersten Unterschied zu erläutern, führt das false-part-Argument für diesen IIf()
-Aufruf zu einer DivideByZeroException
, obwohl das boolesche Argument True
ist.
IIf(true, 1, 1/0)
IIf()
ist nur eine Funktion und wie alle Funktionen müssen alle Argumente ausgewertet werden, bevor der Aufruf erfolgt. Anders ausgedrückt: IIf()
schließt nicht einen Kurzschluss im herkömmlichen Sinne. Auf der anderen Seite führt dieser ternäre Ausdruck einen Kurzschluss aus und ist somit vollkommen in Ordnung:
(true)?1:1/0;
Der andere Unterschied ist, IIf()
ist nicht typsicher. Er akzeptiert Argumente vom Typ Object
und gibt sie zurück. Der ternäre Operator ist vom Typ sicher. Es verwendet Typeninferenz, um zu wissen, mit welchen Typen es sich befasst. Beachten Sie, dass Sie dies mit Ihrer generischen IIF(Of T)()
-Implementierung sehr leicht beheben können. Dies ist jedoch standardmäßig nicht der Fall.
Wenn Sie wirklich IIf()
in C # möchten, 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 dagegen den ternären Operator in VB möchten, stellen Sie in Visual Studio 2008 einen neuen If()
operator zur Verfügung, der wie der ternäre Operator von C # funktioniert. Es verwendet Typeninferenz, um zu wissen, was es zurückgibt, und es ist wirklich ein Operator und keine Funktion. Dies bedeutet, dass es keine Probleme bei der Auswertung von Ausdrücken gibt, obwohl sie über Funktionssemantik verfügen.
VB.NET:
If(someBool, "true", "false")
C #
someBool ? "true" : "false";
der ternäre Operator
bool a = true;
string b = a ? "if_true" : "if_false";
Hilfreich ist auch der Coalesce-Operator ??:
VB:
Return Iif( s IsNot Nothing, s, "My Default Value" )
C #:
return s ?? "My Default Value";
booleanExpression ? trueValue : falseValue;
Beispiel:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html
Es ist der ternäre Operator ?
string newString = i == 1 ? "i is one" : "i is not one";
Es ist insofern begrenzt, als Sie dort keine Aussagen machen können. Sie können nur Werte (oder Dinge, die Werte zurückgeben/auswerten) zurückgeben
Das funktioniert ('a' ist ein statisches int innerhalb der Klasse Blah)
Blah.a=Blah.a<5?1:8;
(runde Klammern stehen implizit zwischen den Gleichgestellten und dem Fragezeichen).
Das geht 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 c # ternary-Operator zur Rückgabe von Werten verwenden. Es ist also nicht ganz eine verkürzte Form eines Falls. Mit Javascript und vielleicht einigen anderen Sprachen können Sie dort Aussagen machen.