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?


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)

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.


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.