Existe-t-il un opérateur ternaire conditionnel dans VB.NET?

446

En Perl (et dans d'autres langues), un opérateur ternaire conditionnel peut être exprimé comme ceci:

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

Existe-t-il un opérateur similaire dans VB.NET?

Jim Counts
la source
13
Un opérateur ternaire est tout opérateur qui prend trois opérandes, un peu comme un opérateur binaire en prend deux et un opérateur unaire en prend un. L'opérateur?: Est un exemple spécifique d'un opérateur ternay, pas la définition.
Zooba

Réponses:

597

Dépend de la version. L' Ifopérateur dans VB.NET 2008 est un opérateur ternaire (ainsi qu'un opérateur de coalescence nulle). Cela vient d'être introduit, avant 2008, il n'était pas disponible. Voici quelques informations supplémentaires: Visual Basic If annonce

Exemple:

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

[ÉDITER]

Avant 2008, c'était le cas IIf, qui fonctionnait presque à l'identique de l' Ifopérateur décrit ci-dessus.

Exemple:

Dim foo as String = IIf(bar = buz, cat, dog)
Bip Bip
la source
15
Avant 2008, c'était IIf, qui fonctionnait de manière presque identique à l'opérateur If décrit dans votre lien.
Zooba
128
... avec la différence importante que Iif (), étant une fonction, a toujours évalué à la fois le conséquent et l'alternative, tandis que le nouveau If n'en évalue qu'un.
Greg Hewgill
6
Qu'est-ce que cela signifie ? If (condition, partie vraie, partie fausse). puis-je riter?
kbvishnu
10
Je suis un grand C, mais je trouve cette syntaxe plus propre que l'opérateur ternaire traditionnel.
écraser le
11
Une autre distinction importante: Iifrenvoie toujours un objet de type Object, tandis que If(bool, obj, obj)permet la vérification de type avec l'option strict on. ( Dim var As Integer = Iif(true, 1, 2)ne compilera pas avec l'option stricte car vous pourriez tout aussi facilement écrire Dim var As Integer = Iif(true, new Object(), new Object()). Vous pouvez cependant écrire Dim var As Integer = If(true, 1, 2)avec l'option stricte, car cela vérifiera le type renvoyé.)
Joseph Nields
78

iif a toujours été disponible en VB, même en VB6.

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

Ce n'est pas un véritable opérateur en tant que tel, mais une fonction dans l'espace de noms Microsoft.VisualBasic.

Kris Erickson
la source
31
Cependant, Iif n'est proche que d'un opérateur ternaire - ce qui signifie que vous ne pouvez pas l'utiliser dans toutes les conditions que vous utiliseriez un If Then Else (ou un opérateur ternaire). Par exemple, Value = Iif (1 = 1, 0, 1/0) exploserait, mais Value = If (1 = 1, 0, 1/0) ne serait pas ...
Bip bip
4
VB ne prend pas en charge l'évaluation des courts-circuits (à l'exception de l'opérateur AndAlso), de sorte que les programmeurs VB ne s'attendent pas vraiment à pouvoir évaluer en toute sécurité la moitié d'une opération. Mais attention, iif est également une fonction de piratage qui a été ajoutée pour une compatibilité descendante, sinon ce serait un véritable opérateur.
Kris Erickson
39
Agréable de catégoriser tous les programmeurs VB ;-) Et il y a aussi IsNot et OrElse à raccourcir, donc VB prend en charge l'évaluation des courts-circuits.
HardCode
2
Iif est un appel de méthode régulier et évalue tous les paramètres. Ce n'est pas ternaire. Se dotnetslackers.com/VB_NET/…
LosManos
3
Comme je l'ai dit, ce n'est PAS un véritable opérateur, et vb6 ne prend pas en charge l'évaluation des courts-circuits, il évalue donc toujours toutes les opérations en ligne.
Kris Erickson
23

Si () est l'équivalent le plus proche, mais méfiez - vous des conversions implicites en cours si vous avez désactivé "Option Strict off"

Par exemple, si vous ne faites pas attention, vous pourriez être tenté d'essayer quelque chose comme:

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

Donnera à "foo" une valeur de 0!

Je pense que le '?' L'opérateur équivalent en C # échouerait à la place la compilation

inconnu
la source
8
Juste pour être complet, la meilleure façon d'écrire cette expression est Dim foo As Integer? = If( someTrueExpression, New Integer?, 2).
Mark Hurd
9
Notez que cela se produit également avec Option Strict On. La raison en est que Nothingdans VB.NET est équivalent à C # default(T)plutôt qu'à null.
Heinzi
1
Et pour quiconque est perplexe, Integer?cela signifie qu'il est nul - voir stackoverflow.com/questions/3628757/make-an-integer-null
AjV Jsy
1
Pour toute personne bloquée sur la conversion implicite pour les types nullables - voir cette réponse pour savoir pourquoi et cette réponse pour une solution de contournement qui jette l'argument avant de retourner ( CType(Nothing, DateTime?).
KyleMit