Question

Existe-t-il un équivalent IIf dans C # ? Ou un raccourci similaire?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top