web-dev-qa-db-fra.com

Qu'est-ce que IIF en C #?

Dupliquer possible:
iif équivalent en c #

J'ai plusieurs lignes de code utilisant IIf dans VB et j'essaie de convertir ce code en C #.

Voici un exemple où j'ai besoin d'aide:

intCurrency = IIf(or.Fields("Currency").Value = "USD", 100, 0)

Comment changer la ligne de code ci-dessus en C #? Existe-t-il un opérateur d'évaluation de court-circuit en C #?

14
abhi

C'est proche de l'opérateur C # ternaire/conditionnel comme plusieurs personnes l'ont suggéré mais ce n'est pas un remplacement exact. L’opérateur ternaire C # effectue une évaluation de court-circuit, ce qui signifie que seul l’effet secondaire de la clause évaluée se produit. Dans VB.Net, la fonction Iif ne met pas en œuvre de court-circuit et évalue les deux effets secondaires.

De plus, la fonction Iif dans VB.Net est faiblement typée. Il accepte et retourne les valeurs saisies avec Object. L'opérateur ternaire C # est fortement typé. 

L'équivalent le plus proche que vous puissiez écrire est le suivant. Mettre les valeurs dans les arguments force l'évaluation de leurs effets secondaires.

public static object Iif(bool cond, object left, object right) {
  return cond ? left : right;
}

Ou légèrement plus utilisable

public static T Iif<T>(bool cond, T left, T right) {
  return cond ? left : right;
}
38
JaredPar

Oui, c'est le point d'interrogation (A.K.A l'opérateur conditionnel ).

intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
16
josh3736

C’est incroyablement pédant, mais l’équivalent le plus proche de IIf en C # est

intCurrency = ((Func<bool, object, object, object>)((x, y, z) => x ? y : z))(or.Fields["Currency"].Value == "USD", 100, 0);

Cependant, je me demande si vous êtes vraiment intéressé par l'opérateur ternaire de VB. Donc ce qui suit en VB

intCurrency = IIf(or.Fields("Currency").Value = "USD", 100, 0) 

pourrait être mieux écrit comme (remarquez la différence entre IIf et If)

intCurrency = If(or.Fields("Currency").Value = "USD", 100, 0) 

qui est exactement la même chose en C #

intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;

Un autre point intéressant est que If sert également d’opérateur de coalescence nul.

Dim text As String = Nothing
text = If(text, "Nothing")

qui est exactement la même chose en C #

string text = null;
text = text ?? "null";
4
Brian Gideon

Je sais que d'autres ont répondu à cela ... mais je pensais clarifier. Si vous souhaitez lire davantage, appelez-le opérateur ternaire ou aussi communément appelé opérateur conditionnel.

3
joshperry

C'est l'opérateur?:.

 or.Fields["Currency"].Value == "USD" ? 100 : 0;

http://msdn.Microsoft.com/en-us/library/ty67wk28.aspx

2
nportelli
intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
1
Thomas

Vous pouvez utiliser l'opérateur?: Pour créer un code équivalent:

intCurrency = or.Fields["Currency"].Value = "USD" ? 100 : 0;
1
Joe Doyle

Comme d'autres l'ont déjà dit, vous recherchez l'opérateur conditionnel :

intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;

Cependant, à titre de correction, il ne s'agit pas d'une "évaluation de court-circuit". Une évaluation de court-circuit signifie qu'une fois qu'une expression booléenne peut être déterminée de manière fiable, aucune autre évaluation n'est effectuée (cela revient à rencontrer une condition true dans une expression or ou une condition false dans une expression and.

Bien qu'il soit possible de combiner des expressions booléennes dans l'opérateur conditionnel, comme vous pouvez le faire dans n'importe quoi d'autre (comme dans une instruction if) et que expression utilisera une évaluation en court-circuit, il n'a rien à faire, per se, avec l'opérateur conditionnel.

Une distinction importante à noter est que, bien que la fonction Iif de VB.NET évalue les expressions vraie et fausse, l'opérateur conditionnel de C # n'évalue que l'expression sélectionnée par la condition booléenne (le faisant se comporter davantage comme une expression if traditionnelle). Cela pourrait être important si le code VB.NET s'appuyait sur les deux expressions en cours d'évaluation.

1
Adam Robinson

or.Fields ("Currency"). Value = "USD"? 100: 0

0
Tom Brothers