Vous trouverez ci-dessous deux instructions if comportant plusieurs conditions et utilisant des opérateurs logiques. Logiquement, les deux sont identiques mais l'ordre de vérification diffère. Le premier fonctionne et le second échoue.
Je me suis référé à MSDN pour vérifier si l’ordre d’exécution des conditions définies; mais je ne pouvais pas trouver.
Considérons une condition de vérification multiple dont &&
est l'opérateur logique. Est-il garanti que la première condition sera toujours vérifiée et que si cette condition n'est pas remplie, la deuxième condition sera vérifiée not ?
J'avais l'habitude d'utiliser l'approche 1 et cela fonctionne bien. Vous recherchez une référence MSDN justifiant l'utilisation.
UPDATE
Référez-vous évaluation "court-circuit"
CODE
List<string> employees = null;
if (employees != null && employees.Count > 0)
{
string theEmployee = employees[0];
}
if (employees.Count > 0 && employees != null)
{
string theEmployee = employees[0];
}
Les && et || court-circuit des opérateurs. C'est:
1) Si && évalue son premier opérande comme faux, il n'évalue pas son second opérande.
2) Si || évalue son premier opérande comme vrai, il n'évalue pas son second opérande.
Cela vous permet de vérifier null && de faire quelque chose avec object, comme si ce n'était pas null, le second opérande n'était pas évalué.
Tu devrais utiliser:
if (employees != null && employees.Count > 0)
{
string theEmployee = employees[0];
}
&&
sera court-circuité et employees.Count
ne sera pas exécuté si employees
est null
.
Dans votre deuxième exemple, l'application lève une exception si employees
est null
lorsque vous tentez Count
les éléments de la collection.
http://msdn.Microsoft.com/en-us/library/2a723cdk(v=vs.71).aspx
Les conditions sont vérifiées de gauche à droite. L'opérateur &&
n'évaluera la bonne condition que si la condition de gauche est vraie.
La section 5.3.3.24 de la spécification du langage C # stipule:
5.3.3.24 && expressions
Pour une expression expr de la forme
expr-first && expr-second
:· L'état d'affectation défini de v avant
expr-first
est identique à l'état d'affectation définitive de v avant expr.· L'état d'attribution défini de v avant
expr-second
est définitivement attribué si l'état de v aprèsexpr-first
est soit définitivement attribué, soit «définitivement attribué après une expression vraie». Sinon, il n'est pas définitivement attribué.· L'état d'affectation défini de v après expr est déterminé par:
o Si l'état de v après
expr-first
est définitivement attribué, alors l'état de v après expr est définitivement attribué.o Sinon, si l'état de v après
expr-second
est définitivement attribué et que l'état de v aprèsexpr-first
est “définitivement attribué après expression fausse”, l'état de v après expr est définitivement attribué.o Sinon, si l'état de v après
expr-second
est définitivement attribué ou «définitivement attribué après l'expression vraie», alors l'état de v après expr est «définitivement attribué après l'expression vraie».o Sinon, si l'état après v
expr-first
est «définitivement attribué après une expression fausse» et si v aprèsexpr-second
est «définitivement attribué après une expression fausse», l'état de v après expr est «définitivement attribué après une expression fausse». .o Sinon, l'état de v après expr n'est pas définitivement attribué.
Cela montre donc que expr-first est toujours évalué et si true, alors et seulement alors, expr-second est également évalué.
de gauche à droite alors que l'expression est encore discutable.
Les && et || les opérateurs sont souvent utilisés pour vérifier les conditions d'objet.
1) La condition "&&" évalue son premier opérande comme faux, elle n'évalue pas son deuxième opérande. Si elle renvoie true, la deuxième condition est évaluée. Si la deuxième condition est vraie, alors seulement elle retournera vraie. Ainsi, && peut être utilisé pour s'assurer que toutes les conditions sont remplies comme valides.
2) Le "||" condition évalue son premier opérande comme vrai, elle n'évalue pas son second opérande. Si la première condition est évaluée comme fausse, seule la deuxième condition sera évaluée. S'il est satisfait, il retournera vrai. Sinon, faux.
L'opérateur AND conditionnel (&&) exécute un AND logique de ses opérandes bool, mais n'évalue que son second opérande si nécessaire.
Voir, par exemple, cette page MSDN pour && qui décrit l’évaluation des courts-circuits.
Vous pouvez vérifier ou prouver la séquence d'exécution comme ceci:
int i;
bool b;
b=((i=3)==0 && (i=4)!=0);
Console.WriteLine(i);
b=((i=3)!=0 || (i=4)!=0);
Console.WriteLine(i);
Vous obtenez 3 dans les deux cas - ce qui montre que dans les deux cas le comportement de court-circuit a lieu. D'autre part, vous pouvez utiliser l'opérateur logique '&' ou '|', respectivement, pour empêcher cela. Vous obtiendrez un résultat de 4, car les deux conditions ont été évaluées.
Est-il garanti que la première condition sera toujours vérifiée et que si N'est pas satisfait, la deuxième condition ne sera pas vérifiée?
La réponse courte est oui.