Есть ли IIf
эквивалент в C #? Или аналогичный ярлык?
c#
.net
conditional-operator
iif-function
Саиф Хан
источник
источник
Ответы:
В C #
?
, как и в других языках C-стиля, есть тернарный оператор. Однако это не полностью эквивалентноIIf()
; есть два важных отличия.Чтобы объяснить первое отличие, аргумент ложной части для этого
IIf()
вызова вызывает aDivideByZeroException
, хотя логический аргумент имеет значение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";
источник
Также полезен оператор объединения ??:
VB:
Return Iif( s IsNot Nothing, s, "My Default Value" )
C #:
return s ?? "My Default Value";
источник
Пример:
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;
если бы он это позволял, это сработало бы, но, по-видимому, это не так. И да, он все еще устанавливает значение и не вызывает там никаких новых методов.