web-dev-qa-db-fra.com

iif équivalent en c #

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

64
Saif Khan

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.

103
Joel Coehoorn

VB.NET:

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

C #

someBool ? "true" : "false";
54
Kevin Pang

l'opérateur ternaire 

bool a = true;

string b = a ? "if_true" : "if_false";
11
Ris Adams

L’opérateur de coalesce est également utile:

VB:

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

C #:

return s ?? "My Default Value";
7
John Gibb
booleanExpression ? trueValue : falseValue;

Exemple:

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

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

5
Zamir

C'est l'opérateur ternaire ?

string newString = i == 1 ? "i is one" : "i is not one";
1
Jon Limjap

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.

0
barlop