2009-05-05 29 views
58

Czy istnieje odpowiednik IIf w ? Lub podobny skrót?Odpowiednik iif w C#

+3

Myślę, że chodziło ci o "skrót", a nie "zwarcie" (co ma szczególne znaczenie w odniesieniu do operatorów boolowskich) - mam rację? – Blorgbeard

Odpowiedz

95

C# ma Ternary Operator, podobnie jak inne języki w stylu C. Jednak nie jest to idealnie równoważne iif. Istnieją dwie ważne różnice.

Aby wyjaśnić pierwszy, ten iif() wywołanie spowoduje wyjątek DivideByZero chociaż wyrażenie jest prawdziwe, ponieważ iif jest tylko funkcja i wszystkie argumenty muszą być ocenione przed wywołaniem:

iif(true, 1, 1/0) 

Innymi słowy, IIF ma nie zwarcie w tradycyjnym sensie, jak wskazuje twoje pytanie. Z drugiej strony, ta trójskładnikowych wyrażenie robi i tak jest w porządku:

(true)?1:1/0; 

Drugą różnicą jest to, że nie jest typ iif bezpieczne. Przyjmuje i zwraca argumenty typu object. Operator trójskładnikowy korzysta z typu wnioskowania, aby wiedzieć, z jakim typem ma do czynienia. Zauważ, że możesz to naprawić bardzo łatwo dzięki ogólnej implementacji, ale po wyjęciu z pudełka, tak właśnie jest.

Jeśli naprawdę chcesz IIF() w C#, można mieć go:

object iif(bool expression, object truePart, object falsePart) 
{return expression?truePart:falsePart; } 

lub rodzajowe/typ-safe realizacji:

T iif<T>(bool expression, T truePart, T falsePart) 
{ return expression?truePart:falsePart;} 

Z drugiej strony, jeśli chcesz operator trójskładnikowy w VB, Visual Studio 2008 i nowszych wersjach zapewnia nowy operator, który działa bardziej jak trójprzewodnik C#. Korzysta z podpowiedzi typu, aby wiedzieć, co powraca i jest operatorem, a nie funkcją, więc nawet jeśli ma semantykę funkcji, nie ma problemów z wyrażeń wstępnych.

+2

VB9 obsługuje prawdziwego operatora trójskładnikowego. Jeśli (SomeBool, MessageBox.Show ("True"), MessageBox.Show ("False")) Jak widać tutaj: http://community.bartdesmet.net/blogs/bart/archive/2007/08/ 31/visual-basic-9-0-the-if-ternary-operator.aspx – snarf

+1

Wspominam o tym w ostatnim akapicie, ale pytanie dotyczyło głównie IIf(). –

11

trójoperandowy operator

bool a = true; 

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

Chciałbym dodać komentarz, że jest to ciąg b = (a? "Asdf": "dsrs"); to znaczy, że można lepiej zrozumieć, jak to działa, i zobaczyć, że nie jest to coś naprawdę dziwnego i bezsensownego (ciąg b = a)? "sdf": "sdsdf"). – barlop

1

To operatorowi trójskładnikowych ?

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

VB.NET:

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

C#

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

Chociaż jest to prawdziwe w przypadku wyrażeń prostych, te dwie formy nie są dokładnie równoważne, jeśli w wyrażeniach alternatywnych występują efekty uboczne. Iif (t, foo(), bar()) wywoła zarówno foo() i bar(), podczas gdy t? foo(): bar() będzie wywoływał tylko foo() lub bar(), ale nie oba. Zobacz odpowiedź Joela Coehoorna na to pytanie, aby uzyskać więcej informacji. –

+1

Zaktualizowano odpowiedź, aby użyć funkcji "If" VB.NET zamiast "IIf", aby dwa bloki kodu były równoważne. –

7

także przydatny jest operator COALESCE ??:

VB:

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

C#: "?"

return s ?? "My Default Value"; 
0

Jest ograniczony, że nie można umieścić tam oświadczenia. Można tylko umieścić wartości (lub rzeczy, które zwracają/oceny do wartości), aby powrócić

To działa ('a' jest static int wewnątrz klasy Blah)

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

(nawiasy okrągłe są impicitly między równa się i znak zapytania).

To nie działa.

Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er"); 
or 
Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er"); 

Można więc używać tylko operatora C# ternary do zwracania wartości. Więc to nie jest tak jak skrócona forma if. JavaScript i być może niektóre inne języki pozwalają na umieszczanie tam stwierdzeń.