Czy w VB.NET istnieje warunkowy operator trójskładnikowy?

446

W Perlu (i innych językach) warunkowy operator trójskładnikowy można wyrazić w następujący sposób:

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

Czy w VB.NET istnieje podobny operator?

Jim się liczy
źródło
13
Operator trójskładnikowy to dowolny operator, który pobiera trzy operandy, podobnie jak operator binarny - dwa, a operator jednoargumentowy - jeden. Operator?: Jest konkretnym przykładem operatora ternay, a nie definicji.
Zooba

Odpowiedzi:

597

Zależy od wersji. IfOperator VB 2008 jest trójskładnikowym operatora (jak operator koalescencji zerowy). Zostało to właśnie wprowadzone, przed 2008 r. Nie było to możliwe. Oto kilka informacji: Visual Basic If Ogłoszenie

Przykład:

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

[EDYTOWAĆ]

Przed rokiem 2008 IIfdziałał on prawie identycznie jak Ifoperator opisany powyżej.

Przykład:

Dim foo as String = IIf(bar = buz, cat, dog)
Sygnał dźwiękowy
źródło
15
Przed 2008 rokiem był IIf, który działał prawie identycznie jak operator If opisany w twoim linku.
Zooba
128
... z tą ważną różnicą, że Iif (), będąc funkcją, zawsze oceniała konsekwencję i alternatywę, podczas gdy nowa If tylko ocenia jedną z nich.
Greg Hewgill
6
co to znaczy ? Jeśli (warunek, część prawdziwa, część fałszywa). czy mogę odprawić?
kbvishnu
10
Jestem wielkim facetem w C, ale uważam, że to narzędzie do czyszczenia składni bardziej niż tradycyjny operator trójskładnikowy.
zmiażdżyć
11
Kolejne ważne rozróżnienie: Iifzawsze zwraca obiekt typu Object, a If(bool, obj, obj)pozwala na sprawdzenie typu z opcją ścisłą. ( Dim var As Integer = Iif(true, 1, 2)nie skompiluje się z opcją ścisłą, ponieważ równie łatwo można pisać Dim var As Integer = Iif(true, new Object(), new Object()). Możesz jednak pisać Dim var As Integer = If(true, 1, 2)z opcją ścisłą, ponieważ sprawdzi, czy typ został zwrócony.)
Joseph Nields
78

iif zawsze był dostępny w VB, nawet w VB6.

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

Nie jest to prawdziwy operator, ale funkcja w przestrzeni nazw Microsoft.VisualBasic.

Kris Erickson
źródło
31
Iif znajduje się jednak tylko w pobliżu operatora trójskładnikowego - co oznacza, że ​​nie można go używać w każdych warunkach, które można zastosować w przypadku If If Else (lub operatora trójskładnikowego). Na przykład wartość = Iif (1 = 1, 0, 1/0) wybuchłaby, ale wartość = Jeśli (1 = 1, 0, 1/0) nie
wybuchłoby
4
VB nie obsługuje oceny zwarć (z wyjątkiem operatora AndAlso), więc programiści VB tak naprawdę nie oczekują, że mogą bezpiecznie ocenić połowę operacji. Ale uwaga: również iif to funkcja hakerska, która została wprowadzona w celu zapewnienia kompatybilności wstecznej, w przeciwnym razie byłby to prawdziwy operator.
Kris Erickson
39
Fajnie jest kategoryzować wszystkich programistów VB ;-) A do skrótów jest też IsNot i OrElse, więc VB rzeczywiście obsługuje ocenę zwarć.
HardCode
2
Iif jest zwykłym wywołaniem metody i ocenia wszystkie parametry. To nie jest trójka. Se dotnetslackers.com/VB_NET/...
LosManos
3
Jak już powiedziałem, NIE jest to prawdziwy operator, a vb6 nie obsługuje oceny zwarcia, więc i tak zawsze ocenia wszystkie operacje on-line.
Kris Erickson,
23

Jeśli () jest najbliższym odpowiednikiem, ale uważaj na niejawne konwersje trwające, jeśli ustawiłeś opcję „Wyłącz ściśle”

Na przykład, jeśli nie jesteś ostrożny, możesz ulec pokusie wypróbowania czegoś takiego:

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

Daje „foo” wartość 0!

Myślę że '?' odpowiednik operatora w języku C # zamiast tego zawiedzie kompilację

nieznany
źródło
8
Dla kompletności lepszym sposobem na napisanie tego wyrażenia jest Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Mark Hurd
9
Pamiętaj, że dzieje się tak również z Option Strict On. Powodem jest to, że Nothingw VB.NET jest odpowiednikiem C # default(T)zamiast null.
Heinzi,
1
A dla każdego, kto Integer?go
zdziwi,
1
Dla każdego, kto utknie na niejawnej konwersji dla typów zerowalnych - zobacz tę odpowiedź na pytanie dlaczego i tę odpowiedź na obejście, które rzuca argument przed zwróceniem ( CType(Nothing, DateTime?).
KyleMit,