wake-up-neo.com

iif entspricht in c #

Gibt es eine IIf-Entsprechung in C#? Oder eine ähnliche Abkürzung?

64
Saif Khan

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.

103
Joel Coehoorn

VB.NET:

If(someBool, "true", "false")

C #

someBool ? "true" : "false";
54
Kevin Pang

der ternäre Operator 

bool a = true;

string b = a ? "if_true" : "if_false";
11
Ris Adams

Hilfreich ist auch der Coalesce-Operator ??:

VB:

Return Iif( s IsNot Nothing, s, "My Default Value" )

C #:

return s ?? "My Default Value";
7
John Gibb
booleanExpression ? trueValue : falseValue;

Beispiel:

string itemText = count > 1 ? "items" : "item";

http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html

5
Zamir

Es ist der ternäre Operator ?

string newString = i == 1 ? "i is one" : "i is not one";
1
Jon Limjap

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.

0
barlop