Le C# dispose du ?
opérateur ternaire, comme les autres langages de type C. Cependant, cela n'est pas parfaitement équivalent à IIf()
; il existe deux différences importantes.
Pour expliquer la première différence, l'argument de la fausse partie pour cette IIf()
provoque un DivideByZeroException
même si l'argument booléen est True
.
IIf(true, 1, 1/0)
IIf()
est juste une fonction, et comme toutes les fonctions, tous les arguments doivent être évalués avant que l'appel soit effectué. En d'autres termes, IIf()
fait pas court-circuit au sens traditionnel du terme. En revanche, cette expression ternaire court-circuite bien, et est donc parfaitement acceptable :
(true)?1:1/0;
L'autre différence est IIf()
n'est pas sûr du type. Il accepte et renvoie des arguments de type Object
. L'opérateur ternaire est type de coffre-fort. Il utilise l'inférence de type pour savoir à quels types il a affaire. Notez que vous pouvez corriger cela très facilement avec votre propre générique. IIF(Of T)()
mais en dehors de la boîte, ce n'est pas comme ça.
Si vous voulez vraiment IIf()
en C#, vous pouvez l'avoir :
object IIf(bool expression, object truePart, object falsePart)
{return expression?truePart:falsePart;}
ou une implémentation générique/sûre :
T IIf<T>(bool expression, T truePart, T falsePart)
{return expression?truePart:falsePart;}
D'autre part, si vous souhaitez utiliser l'opérateur ternaire en VB, Visual Studio 2008 et les versions ultérieures fournissent un nouvel outil de gestion de l'opérateur. If()
opérateur qui fonctionne comme l'opérateur ternaire de C#. Il utilise l'inférence de type pour savoir ce qu'il retourne, et c'est vraiment un opérateur plutôt qu'une fonction. Cela signifie qu'il n'y a pas de problème de pré-évaluation des expressions, même s'il a une sémantique de fonction.
5 votes
Je pense que vous vouliez dire "raccourci", plutôt que "court-circuit" (qui a une signification spécifique concernant les opérateurs booléens) - n'est-ce pas ?