Чи є у VB.NET умовний потрійний оператор?


446

У Perl (та інших мовах) умовний термінальний оператор може бути виражений так:

my $foo = $bar == $buz ? $cat : $dog;

Чи є подібний оператор у VB.NET?


13
Потрійний оператор - це будь-який оператор, який приймає три операнди, подібно до того, як двійковий оператор приймає два, а одинарний - один. Оператор?: - це конкретний приклад тернайського оператора, а не визначення.
Zooba

Відповіді:


597

Залежить від версії. IfОператор в VB.NET 2008 є трикомпонентним оператором (а також оператор зрощування нуля). Це було щойно запроваджено, до 2008 року такого не було. Ось ще інформація: Visual Basic Якщо оголошення

Приклад:

Dim foo as String = If(bar = buz, cat, dog)

[EDIT]

До 2008 року це було IIf, що працювало майже однаково Ifоператору, описаному вище.

Приклад:

Dim foo as String = IIf(bar = buz, cat, dog)

15
До 2008 року це був IIf, який працював майже однаково оператору If, описаному у вашому посиланні.
Zooba

128
... з тією важливою відмінністю, що Iif (), будучи функцією, завжди оцінюється як послідовним, так і альтернативним, тоді як новий If Only оцінює лише один з них.
Грег Хьюгілл

6
що це означає? Якщо (умова, справжня частина, хибна частина). чи можу я обряд?
kbvishnu

10
Я величезний хлопець С, але я вважаю цей синтаксис чистішим, ніж традиційний потрійний оператор.
розчавити

11
Ще одне важливе розмежування: Iifзавжди повертає об'єкт типу Object, тоді як If(bool, obj, obj)дозволяє перевірити тип із суворою опцією. ( Dim var As Integer = Iif(true, 1, 2)не буде компілюватися з опцією, суворою для того, що ви можете так само легко писати Dim var As Integer = Iif(true, new Object(), new Object()). Ви можете писати Dim var As Integer = If(true, 1, 2)з параметром строго на хоч, тому що він перевірить тип, що повернувся.)
Джозеф Нілдс,

78

iif завжди був доступний у VB, навіть у VB6.

Dim foo as String = iif(bar = buz, cat, dog)

Це не справжній оператор як такий, а функція в просторі імен Microsoft.VisualBasic.


31
Хоча Iif близький лише до потрійного оператора, - це означає, що ви не могли використовувати його в будь-яких умовах, якби це був If If Else (або потрійний оператор). Наприклад, значення = Iif (1 = 1, 0, 1/0) підірветься, але значення = якщо (1 = 1, 0, 1/0) не буде ...
звуковий сигнал

4
VB не підтримує оцінку короткого замикання (за винятком оператора AndAlso), тому програмісти VB насправді не очікують, що вони можуть спокійно оцінити половину операції. Але з точки зору, також iif - це функція злому, яку було застосовано для зворотної сумісності, інакше це був би реальний оператор.
Кріс Еріксон

39
Приємно класифікувати всіх програмістів VB ;-) І є також IsNot та OrElse для ярлика, тому VB дійсно підтримує оцінку короткого замикання.
HardCode

2
Iif - це звичайний виклик методу і оцінює всі параметри. Це не потрійне. Se dotnetslackers.com/VB_NET/…
LosManos

3
Як я вже зазначив, це НЕ справжній оператор, і vb6 не підтримує оцінку короткого замикання, тому він завжди так чи інакше оцінює всі операції в лінії.
Кріс Еріксон

23

If () - це найближчий еквівалент, але будьте обережні непрямих конверсій, що відбуваються, якщо ви встановили "Параметр строго вимкнено"

Наприклад, якщо ви не обережні, ви можете спробувати спробувати щось на кшталт:

Dim foo As Integer? = If( someTrueExpression, Nothing, 2)

Дасть "foo" значення 0!

Я думаю, що "?" еквівалент оператора в C # замість цього не зможе компілювати


8
Тільки для повноти кращий спосіб написати цей вираз Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Марк Херд

9
Зауважте, що це теж трапляється з Option Strict On. Причина в тому, що NothingVB.NET еквівалентний C #, default(T)а не null.
Хайнзі

1
І для тих , хто спантеличений Integer?це означає , що це обнуляється - см stackoverflow.com/questions/3628757/make-an-integer-null
AJV JSY

1
Для тих, хто зациклюється на неявній конвертації для змінних типів - див. Цю відповідь щодо того, чому і ця відповідь для вирішення проблеми, яка кидає аргумент перед поверненням ( CType(Nothing, DateTime?).
KyleMit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.