Есть ли IIf
эквивалент в C#
? Или подобный ярлык?iif эквивалент в C#
ответ
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#. Он использует вывод типа для того, чтобы знать, что он возвращает, и это скорее оператор, чем функция, поэтому, хотя у него есть семантика функций, нет проблем с предварительными вычислениями.
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
Я упоминаю это в последнем абзаце, но вопрос был конкретно о IIf(). –
тройной оператор
bool a = true;
string b = a ? "if_true" : "if_false";
Я бы добавил там комментарий, что это строка b = (a? "Asdf": "dsrs"); то есть тогда можно лучше понять, как это работает, и увидеть, что это не что-то действительно странное и бессмысленное (строка b = a)? "sdf": "sdsdf"). – barlop
Это оператор троичного ?
string newString = i == 1 ? "i is one" : "i is not one";
VB.NET:
If(someBool, "true", "false")
C#
someBool ? "true" : "false";
Хотя это справедливо для простых выражений, эти две формы не совсем эквивалентны, если в альтернативных выражениях есть побочные эффекты. Iif (t, foo(), bar()) вызовут как foo(), так и bar(), а t? foo(): bar() будет вызывать только foo() или bar(), но не оба. См. Ответ Джоэля Коэхорна на этот вопрос для получения дополнительной информации. –
Обновлен ответ на использование функции «Если» VB.NET вместо «IIf», чтобы два кодовых блока были эквивалентными. –
Также полезным является 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
Он ограничен в том, что вы не можете поставить заявления там. Вы можете только положить ценности (или вещи, которые возвращают/оценки для значений), чтобы вернуться
Это работает («а» является статическим ИНТОМ в пределах класса Л)
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 и, возможно, некоторые другие языки позволяют размещать там заявления.
- 1. CASE-эквивалент вложенного заявления IIF
- 2. Преобразование SUM IIF регулярно IIF
- 3. как использовать IIF в привязке данных C#?
- 4. Функция IIF в SSRS
- 5. Java Equivalent to iif function
- 6. Oracle Equivalent для IIF в Access SQL?
- 7. C++ эквивалент Союза в C?
- 8. C# эквивалент Obj-C в
- 9. Эквивалент numpy.nan_to_num в C/C++
- 10. C++ эквивалент CString в C#
- 11. BITMAPFILEHEADER эквивалент в c/C++?
- 12. strstr() эквивалент в C#
- 13. PathCanonicalize эквивалент в C#
- 14. эквивалент LinkedHashmap в C++?
- 15. Эквивалент NSMutableArray в C++?
- 16. Эквивалент Guice в C#
- 17. privateEncrypt эквивалент в C#
- 18. NSNotificationCenter эквивалент в C++
- 19. Эквивалент CreateObject в C++
- 20. эквивалент ereg_replace в C#
- 21. эквивалент Или в C#
- 22. Typedef-эквивалент в C#?
- 23. IsNan эквивалент в C
- 24. эквивалент python's [:] в C++
- 25. $ (этот) эквивалент в C#
- 26. setTimeOut Эквивалент в c?
- 27. Математический эквивалент в C++
- 28. DateTime-эквивалент в C
- 29. Response.Redirect эквивалент в C#
- 30. Обещающий эквивалент в C#
Я думаю, вы имели в виду «короткое замыкание», а не «короткое замыкание» (которое имеет конкретное значение для булевых операторов). Правильно? – Blorgbeard