2009-05-05 14 views
58

Gibt es ein IIf Äquivalent in C#? Oder eine ähnliche Abkürzung?iif Äquivalent in C#

+3

Ich denke, Sie meinten "Abkürzung", anstatt "Kurzschluss" (was eine bestimmte Bedeutung in Bezug auf Boolesche Operatoren hat) - habe ich recht? – Blorgbeard

Antwort

95

C# hat die ternärer Operator, wie andere Sprachen im C-Stil. Dies ist jedoch nicht völlig äquivalent zu iif. Es gibt zwei wichtige Unterschiede.

die ersten Um zu erklären, dieser iif() Anruf eine DivideByZero Ausnahme selbst würde dazu führen, obwohl der Ausdruck wahr ist, weil iif nur eine Funktion ist, und alle Argumente müssen vor dem Aufruf ausgewertet werden:

iif(true, 1, 1/0) 

anders gesagt, iif tut nicht Kurzschluss im traditionellen Sinne, wie Ihre Frage angibt. Auf der anderen Seite, dieser ternäre Ausdruck tut und so ist völlig in Ordnung:

(true)?1:1/0; 

Der andere Unterschied ist, dass iif nicht sicher ist, ein. Es akzeptiert und gibt Argumente vom Typ object zurück. Der ternäre Operator verwendet Typinferenz, um zu wissen, um welchen Typ es sich handelt. Beachten Sie, dass Sie dies sehr einfach mit einer generischen Implementierung beheben können, aber so wie es ist.

Wenn Sie wirklich wollen IIF() in C#, können Sie sie 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;} 

Auf der anderen Seite, wenn Sie wollen der ternäre Operator in VB, Visual Studio 2008 und später bietet einen neuen IfOperator, der mehr wie C# ternary funktioniert. Es verwendet Typinferenz, um zu wissen, was es zurückgibt, und es ist eher ein Operator als eine Funktion. Obwohl es eine Funktionssemantik hat, gibt es keine Probleme bei der Vorauswertung von Ausdrücken.

+2

VB9 unterstützt einen echten ternären Operator. Wenn (SomeBool, MessageBox.Show ("True"), MessageBox.Show ("False")) Wie hier zu sehen: http://community.bartdesmet.net/blogs/bart/archive/2007/08/ 31/Visual-Basic-9-0-The-Wenn-Ternär-Operator.aspx – snarf

+1

Ich erwähne es im letzten Absatz, aber die Frage war speziell über IIf(). –

11

der ternäre Operator

bool a = true; 

string b = a ? "if_true" : "if_false"; 
+0

Ich würde dort einen Kommentar hinzufügen, dass die Zeichenfolge b = (a? "Asdf": "dsrs"); d. h., dann ist es möglich, besser zu verstehen, wie das Ding funktioniert, und zu sehen, dass es nicht etwas wirklich Unheimliches und Unsinniges ist (String b = a)? "sdf": "sdsdf"). – barlop

1

Es ist der ternäre Operator ?

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

VB.NET:

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

C#

someBool ? "true" : "false"; 
+1

Während dies für einfache Ausdrücke gilt, sind die beiden Formen nicht genau gleichwertig, wenn es in den alternativen Ausdrücken Nebenwirkungen gibt. Iif (t, foo(), bar()) ruft sowohl foo() als auch bar() auf, während t? foo(): bar() ruft entweder nur foo() oder bar() auf, aber nicht beide. Weitere Informationen finden Sie in Joel Coehoorns Antwort auf diese Frage. –

+1

Aktualisierte Antwort, um die "If" -Funktion von VB.NET anstelle von "IIf" zu verwenden, sodass die beiden Codeblöcke gleichwertig sind. –

7

Brauchbar ist auch das coalesce Operator ??:

VB:

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

C#: "?"

return s ?? "My Default Value"; 
0

Es ist dadurch begrenzt, dass Sie keine Aussagen in dort setzen können. Sie können nur Werte (oder Dinge, die Werte zurückgeben/auswerten) setzen,

Das funktioniert (‚a‘ ist eine statische int innerhalb Klasse Blah) zurückzukehren

Blah.a=Blah.a<5?1:8; 

(runde Klammern sind impicitly zwischen der gleich und das Fragezeichen).

Dies 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 C# ternary-Operator für die Rückgabe von Werten verwenden. Es ist also nicht wie eine verkürzte Form eines if. Javascript und vielleicht einige andere Sprachen lassen Sie Aussagen dort hineinlegen.