IIF эквивалент в c#
есть IIf
в эквиваленте C#
? Или подобный ярлык?
7 ответов:
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#. Он использует вывод типа, чтобы знать, что он возвращает, и это оператор, а не функция, поэтому, хотя он имеет семантику функций, нет проблем с предварительной оценкой выражений.
также полезен оператор coalesce ??:
VB:
Return Iif( s IsNot Nothing, s, "My Default Value" )
C#:
return s ?? "My Default Value";
booleanExpression ? trueValue : falseValue;
пример:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html
Это ограничено тем, что вы не можете поместить туда заявления. Вы можете только поставить значения (или вещи, которые возвращают / оценивают значения), чтобы вернуть
это работает ('a' является статическим int в классе бла)
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");