Чи існує IIf
еквівалент у C #? Або подібний ярлик?
Відповіді:
У C # є ?
тернарний оператор, як і в інших мовах стилю С. Однак це не є абсолютно рівнозначним IIf()
; є дві важливі відмінності.
Для пояснення першої різниці аргумент false-частини для цього 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;
тоді, якщо це дозволяло, це спрацювало б, але, мабуть, ні. Так, він все ще встановлює значення, і ні, це не викликає жодного нового методу.