Existe-t-il un équivalent IIf
dans C#
? Ou un raccourci similaire?
C # a l'opérateur ternaire ?
, comme les autres langages de style C. Cependant, ceci n’est pas parfaitement équivalent à IIf()
; il y a deux différences importantes.
Pour expliquer la première différence, l'argument de partie fausse pour cet appel IIf()
provoque une DivideByZeroException
, même si l'argument booléen est True
.
IIf(true, 1, 1/0)
IIf()
n'est qu'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-circuite au sens traditionnel. Par contre, cette expression ternaire court-circuite et convient donc parfaitement:
(true)?1:1/0;
L'autre différence est IIf()
n'est pas sûr. Il accepte et retourne des arguments de type Object
. L'opérateur ternaire est type safe. Il utilise l'inférence de type pour savoir à quels types il traite. Notez que vous pouvez résoudre ce problème très facilement avec votre propre implémentation générique IIF(Of T)()
, mais ce n'est pas le cas.
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/type-safe:
T IIf<T>(bool expression, T truePart, T falsePart)
{return expression?truePart:falsePart;}
D'autre part, si vous souhaitez que l'opérateur ternaire en VB, Visual Studio 2008 et versions ultérieures fournissent un nouvel opérateur If()
qui fonctionne comme l'opérateur ternaire C #. Il utilise l'inférence de type pour savoir ce qu'il retourne et il s'agit en réalité d'un opérateur plutôt que d'une fonction. Cela signifie qu'il n'y a pas de problème de pré-évaluation d'expressions, même si elles ont une sémantique de fonction.
VB.NET:
If(someBool, "true", "false")
C #
someBool ? "true" : "false";
l'opérateur ternaire
bool a = true;
string b = a ? "if_true" : "if_false";
L’opérateur de coalesce est également utile:
VB:
Return Iif( s IsNot Nothing, s, "My Default Value" )
C #:
return s ?? "My Default Value";
booleanExpression ? trueValue : falseValue;
Exemple:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html
C'est l'opérateur ternaire ?
string newString = i == 1 ? "i is one" : "i is not one";
C'est limité en ce que vous ne pouvez pas y insérer de déclarations. Vous pouvez seulement mettre des valeurs (ou des choses qui retournent/évaluent des valeurs), pour retourner
Cela fonctionne ('a' est un int statique dans la classe Blah)
Blah.a=Blah.a<5?1:8;
(les parenthèses sont impitoyablement entre les égaux et le point d'interrogation).
Ça ne marche pas.
Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er");
or
Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er");
Vous ne pouvez donc utiliser que l'opérateur c # ternary pour renvoyer des valeurs. Donc, ce n'est pas tout à fait comme une forme abrégée d'un if. Javascript et peut-être quelques autres langages vous permettent d’y insérer des déclarations.