47 votes

"if (a() && b != null)", "a()" sera-t-il toujours évalué ?

J'ai un tel code :

if (a() && b != null) {
    b.doSomething();
}

J'ai besoin de l'effet secondaire de a() même si b es null . Est-il garanti par C# ? Ou C# peut omettre a() appeler si b es null ?

118voto

AakashM Points 32891

Oui, a() sera toujours évaluée.

Puisque la condition est évaluée de gauche à droite, a() sera toujours évalué, mais b != null ne sera évalué que si a() renvoie à true .

Voici une référence exacte pour vous, tirée de la spécification du langage C# version 3.0. Mes accentuations et élisions.

7.11.1 Opérateurs logiques conditionnels booléens

Lorsque les opérandes de && o || sont de type bool [...] l'opération est traitée comme suit :

  • L'opération x && y est évalué comme suit x ? y : false . En d'autres termes, x es primero évaluée et convertie en type bool. Ensuite, si x est vrai y est évalué et converti en type bool, ce qui devient le résultat de l'opération. l'opération. Sinon, le résultat de l'opération est faux.

31voto

Jan Jongboom Points 15148

Oui, les expressions sont évaluées de gauche à droite, donc a() sera toujours appelé.

Voir le Spécification du langage C# (ECMA 334, paragraphe 8.5) :

À l'exception des opérateurs d'assignation, tous les opérateurs binaires sont gauche, ce qui signifie que les opérations sont effectuées de gauche à droite. droite. Par exemple, x + y + z est évalué comme (x + y) + z.

17voto

Linus Kleen Points 15925

La condition est évaluée de gauche à droite. Ainsi, a() est toujours exécuté, mais b pourrait ne soit pas évalué en fonction du résultat de a() .

13voto

Sean Points 22088

a() sera toujours évaluée. b != null ne sera évalué que si a() est évalué à true.

C'est ce qu'on appelle évaluation des courts-circuits .

6voto

D.. Points 3450

Le côté gauche de && est toujours évalué. Le côté droit ne sera évalué que si le côté gauche est vrai. Tout devrait donc bien se passer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X