web-dev-qa-db-fra.com

Ordre d'exécution des conditions dans la déclaration C # If

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];
  }
17
Lijo

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é.

37
Patashu

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

9
Darren

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ès expr-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ès expr-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ès expr-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é.

7
John Willemse

de gauche à droite alors que l'expression est encore discutable.

3
G.Y

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.

2
Chirag

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.

2
Frank Rem

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.

0
JeffRSon

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.

0
yclkvnc