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 #?
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;
}
Oui, c'est le point d'interrogation (A.K.A l'opérateur conditionnel ).
intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
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";
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.
C'est l'opérateur?:.
or.Fields["Currency"].Value == "USD" ? 100 : 0;
intCurrency = or.Fields["Currency"].Value == "USD" ? 100 : 0;
Vous pouvez utiliser l'opérateur?: Pour créer un code équivalent:
intCurrency = or.Fields["Currency"].Value = "USD" ? 100 : 0;
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.
or.Fields ("Currency"). Value = "USD"? 100: 0