2009-05-05 2 views
58

Есть ли IIf эквивалент в C#? Или подобный ярлык?iif эквивалент в C#

+3

Я думаю, вы имели в виду «короткое замыкание», а не «короткое замыкание» (которое имеет конкретное значение для булевых операторов). Правильно? – Blorgbeard

ответ

95

C# имеет тройной оператор, как и другие языки C-стиля. Однако это не совсем эквивалентно iif. Есть два важных отличия.

Для объяснения первых, это iif() вызов вызовет исключение DivideByZero, даже если выражение истинно, потому что iif это просто функция, и все аргументы должны быть оценены перед вызовом:

iif(true, 1, 1/0) 

Другими словами, IIF не короткое замыкание в традиционном смысле, как указывает ваш вопрос. С другой стороны, это тройная выражение делает и так прекрасно:

(true)?1:1/0; 

Другим отличием является то, что iif не типобезопасен. Он принимает и возвращает аргументы типа object. Тернарный оператор использует вывод типа, чтобы узнать, с каким типом он имеет дело. Обратите внимание, что вы можете исправить это очень легко с помощью общей реализации, но из коробки это так, как есть.

Если вы действительно хотите IIF() в C#, вы можете иметь его:

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

или родовую/типобезопасную реализацию:

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

С другой стороны, если вы хотите тройной оператор в VB, Visual Studio 2008 и более поздние версии предоставляет новый Ifоператор, который больше похож на C#. Он использует вывод типа для того, чтобы знать, что он возвращает, и это скорее оператор, чем функция, поэтому, хотя у него есть семантика функций, нет проблем с предварительными вычислениями.

+2

VB9 поддерживает истинный тернарный оператор. Если (SomeBool, MessageBox.Show («Истина»), MessageBox.Show («False»)) Как показано здесь: http://community.bartdesmet.net/blogs/bart/archive/2007/08/ 31/visual-basic-9-0-the-if-trernary-operator.aspx – snarf

+1

Я упоминаю это в последнем абзаце, но вопрос был конкретно о IIf(). –

11

тройной оператор

bool a = true; 

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

Я бы добавил там комментарий, что это строка b = (a? "Asdf": "dsrs"); то есть тогда можно лучше понять, как это работает, и увидеть, что это не что-то действительно странное и бессмысленное (строка b = a)? "sdf": "sdsdf"). – barlop

1

Это оператор троичного ?

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

VB.NET:

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

C#

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

Хотя это справедливо для простых выражений, эти две формы не совсем эквивалентны, если в альтернативных выражениях есть побочные эффекты. Iif (t, foo(), bar()) вызовут как foo(), так и bar(), а t? foo(): bar() будет вызывать только foo() или bar(), но не оба. См. Ответ Джоэля Коэхорна на этот вопрос для получения дополнительной информации. –

+1

Обновлен ответ на использование функции «Если» VB.NET вместо «IIf», чтобы два кодовых блока были эквивалентными. –

7

Также полезным является COALESCE оператор ??:

VB:

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

C#: "?"

return s ?? "My Default Value"; 
0

Он ограничен в том, что вы не можете поставить заявления там. Вы можете только положить ценности (или вещи, которые возвращают/оценки для значений), чтобы вернуться

Это работает («а» является статическим ИНТОМ в пределах класса Л)

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

(круглые скобки impicitly между равно и знак вопроса).

Это не работает.

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

Таким образом, вы можете использовать только термальный оператор C# для возврата значений. Так что это не совсем укороченная форма if. Javascript и, возможно, некоторые другие языки позволяют размещать там заявления.