85 votes

Équivalent de Iif en C#

Y a-t-il un IIf équivalent en C# ? Ou un raccourci similaire ?

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 ?

128voto

Joel Coehoorn Points 190579

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.

3 votes

VB9 supporte un véritable opérateur ternaire. If(SomeBool, MessageBox.Show("True"), MessageBox.Show("False")) Comme on le voit ici : community.bartdesmet.net/blogs/bart/archive/2007/08/31/

1 votes

Je le mentionne dans le dernier paragraphe, mais la question portait spécifiquement sur IIf().

67voto

Kevin Pang Points 16019

VB.NET :

If(someBool, "true", "false")

C#

someBool ? "true" : "false";

2 votes

Bien que cela soit vrai pour les expressions simples, les deux formes ne sont pas exactement équivalentes s'il existe des effets secondaires dans les expressions alternatives. Iif(t, foo(), bar()) appellera à la fois foo() et bar(), alors que t ? foo() : bar() n'appellera que foo() ou bar() mais pas les deux. Voir la réponse de Joel Coehoorn à cette question pour plus d'informations.

1 votes

Mise à jour de la réponse pour utiliser la fonction "If" de VB.NET au lieu de "IIf" afin que les deux blocs de code soient équivalents.

13voto

Causas Points 970

L'opérateur ternaire

bool a = true;

string b = a ? "if_true" : "if_false";

0 votes

J'ajouterais un commentaire disant que c'est la chaîne b= (a ? "asdf" : "dsrs") ; c'est-à-dire qu'il est possible de mieux comprendre comment la chose fonctionne, et de voir que ce n'est pas quelque chose de vraiment bizarre et absurde comme (chaîne b=a) ? "sdf" : "sdsdf").

10voto

John Gibb Points 4473

L'opérateur de coalescence est également utile :

VB :

Return Iif( s IsNot Nothing, s, "My Default Value" )

C# :

return s ?? "My Default Value";

6voto

Zamir Points 21
booleanExpression ? trueValue : falseValue;

Exemple :

string itemText = count > 1 ? "items" : "item";

http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X