Есть ли IIf
эквивалент в C #? Или аналогичный ярлык?
Ответы:
В C # ?
, как и в других языках C-стиля, есть тернарный оператор. Однако это не полностью эквивалентно IIf()
; есть два важных отличия.
Чтобы объяснить первое отличие, аргумент ложной части для этого IIf()
вызова вызывает a 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 #. Он использует вывод типа, чтобы узнать, что он возвращает, и на самом деле это оператор, а не функция. Это означает, что нет проблем с предварительной оценкой выражений, даже если они имеют семантику функций.
VB.NET:
If(someBool, "true", "false")
C #
someBool ? "true" : "false";
тернарный оператор
bool a = true;
string b = a ? "if_true" : "if_false";
booleanExpression ? trueValue : falseValue;
Пример:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html
Это тернарный оператор ?
string newString = i == 1 ? "i is one" : "i is not one";
Он ограничен тем, что вы не можете помещать туда заявления. Вы можете только помещать значения (или вещи, которые возвращают / оценивают значения), чтобы вернуть
Это работает ('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 и, возможно, некоторые другие языки позволяют помещать туда операторы.
Action
делать то, что хотите.
iif
или тернарный оператор, позвольте вам поместить туда возвращаемое значение, например, Blah.a = Blah.a < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2;
если бы он это позволял, это сработало бы, но, по-видимому, это не так. И да, он все еще устанавливает значение и не вызывает там никаких новых методов.