iif équivalent en c #
-
03-07-2019 - |
Question
Existe-t-il un équivalent IIf
dans C #
? Ou un raccourci similaire?
La solution
C # possède l'opérateur ternaire ?
, comme les autres langages de style C. Cependant, cela 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 un 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 ne soit passé. En d'autres termes, IIf ()
ne pas court-circuiter au sens traditionnel du terme. Par contre, cette expression ternaire court-circuite et convient donc parfaitement:
(true)?1:1/0;
L'autre différence est que IIf ()
n'est pas sécurisé. Il accepte et retourne des arguments de type Object
. L'opérateur ternaire est de type sûr. 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 de 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èmes de pré-évaluation d'expressions, même si elles ont une sémantique de fonction.
Autres conseils
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 fusion ??:
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 sens que vous ne pouvez pas y insérer d’énoncé. Vous pouvez seulement mettre des valeurs (ou des choses qui retournent / évaluent des valeurs), pour retourner
Ceci fonctionne ('a' est un entier statique dans la classe Blah)
Blah.a=Blah.a<5?1:8;
(les parenthèses sont impises entre les égaux et le point d'interrogation).
Cela ne fonctionne 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 ternaire c # 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.