Gibt es ein IIf
Äquivalent in C #? Oder eine ähnliche Verknüpfung?
Antworten:
C # hat den ?
ternären Operator, wie andere Sprachen im C-Stil. Dies ist jedoch nicht perfekt gleichbedeutend mit IIf()
; Es gibt zwei wichtige Unterschiede.
Um den ersten Unterschied zu erklären, verursacht das Argument false-part für diesen IIf()
Aufruf a DivideByZeroException
, obwohl das boolesche Argument lautet True
.
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ück Object
. 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 generischen IIF(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.
VB.NET:
If(someBool, "true", "false")
C #
someBool ? "true" : "false";
der ternäre Operator
bool a = true;
string b = a ? "if_true" : "if_false";
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 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.
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.