Iif еквівалент в C #


79

Чи існує IIfеквівалент у C #? Або подібний ярлик?


4
Думаю, ви мали на увазі "короткий шлях", а не "коротке замикання" (що має конкретне значення щодо булевих операторів) - я не помиляюся?
Blorgbeard вийшов

Відповіді:


120

У 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 #. Він використовує умовивід типу, щоб знати, що він повертає, і насправді це оператор, а не функція. Це означає, що немає жодних проблем із попередньою оцінкою виразів, хоча вона має функціональну семантику.


2
VB9 підтримує справжнього потрійного оператора. Якщо (SomeBool, MessageBox.Show ("True"), MessageBox.Show ("False")) Як видно тут: community.bartdesmet.net/blogs/bart/archive/2007/08/31/…
snarf

1
Я згадую про це в останньому абзаці, але питання стосувалось саме IIf ().
Джоел Коухорн,

61

VB.NET:

If(someBool, "true", "false")

C #

someBool ? "true" : "false";

1
Хоча це справедливо для простих виразів, дві форми не є абсолютно еквівалентними, якщо в альтернативних виразах є побічні ефекти. Iif (t, foo (), bar ()) буде викликати і foo (), і bar (), тоді як t? foo (): bar () буде викликати лише foo () або bar (), але не обидва. Докладнішу інформацію див. У відповіді Джоела Кехурна на це питання.
Грег Хьюгілл

1
Оновлена ​​відповідь для використання функції "Якщо" VB.NET замість "IIf", щоб два блоки коду були еквівалентними.
Кевін Панг

13

потрійний оператор

bool a = true;

string b = a ? "if_true" : "if_false";

я б додав туди коментар, що це рядок b = (a? "asdf": "dsrs"); тобто тоді можна краще зрозуміти, як ця річ працює, і побачити, що це не щось справді дивне і безглузде, як (рядок b = a)? "sdf": "sdsdf").
Barlop

10

Також корисний оператор злиття ??:

VB:

Return Iif( s IsNot Nothing, s, "My Default Value" )

C #:

return s ?? "My Default Value";



0

Це обмежено тим, що ви не можете туди вкладати заяви. Ви можете повернути лише значення (або речі, які повертають / оцінюють до значень)

Це працює ('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хоч можеш робити те, що хочеш.
Kieran Foot

@KieranFoot WriteLine - це метод. Минув якийсь час, але якщо iifчи тернарний оператор, дозвольте вам ввести туди повернене значення, як Blah.a = Blah.a < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2; тоді, якщо це дозволяло, це спрацювало б, але, мабуть, ні. Так, він все ще встановлює значення, і ні, це не викликає жодного нового методу.
barlop
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.