если эквивалент в C # - PullRequest
66 голосов
/ 05 мая 2009

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

Ответы [ 7 ]

105 голосов
/ 05 мая 2009

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

Чтобы объяснить первое различие, аргумент ложной части для этого вызова IIf() вызывает DivideByZeroException, хотя логический аргумент - True.

IIf(true, 1, 1/0)

IIf() - это просто функция, и, как и все функции, все аргументы должны быть оценены до вызова. Другими словами, IIf() не делает короткое замыкание в традиционном смысле. С другой стороны, это троичное выражение делает короткое замыкание, и поэтому прекрасно:

(true)?1:1/0;

Другое отличие состоит в том, что IIf() небезопасен. Он принимает и возвращает аргументы типа Object. Тернарный оператор является типом . Он использует вывод типов, чтобы знать, с какими типами он имеет дело. Обратите внимание, что вы можете легко исправить это с помощью собственной общей реализации IIF(Of T)(), но из коробки это не так.

Если вы действительно хотите 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 #. Он использует вывод типа, чтобы знать, что он возвращает, и это действительно оператор, а не функция. Это означает, что нет проблем с предварительным вычислением выражений, даже если оно имеет семантику функций.

56 голосов
/ 05 мая 2009

VB.NET:

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

C #

someBool ? "true" : "false";
11 голосов
/ 05 мая 2009

троичный оператор

bool a = true;

string b = a ? "if_true" : "if_false";
8 голосов
/ 05 мая 2009

Также полезен оператор объединения?:

VB:

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

C #:

return s ?? "My Default Value";
5 голосов
/ 08 декабря 2011
booleanExpression ? trueValue : falseValue;

Пример:

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

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

1 голос
/ 05 мая 2009

Это троичный оператор ?

string newString = i == 1 ? "i is one" : "i is not one";
0 голосов
/ 20 апреля 2016

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

Это работает ('a' является статическим int внутри класса Blah)

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

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

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

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 и, возможно, некоторые другие языки позволяют размещать здесь заявления.

...