40. Opérateurs paresseux (lazy)▲
L'évaluation paresseuse consiste à retarder l'exécution d'expressions jusqu'au moment où l'on a besoin du résultat de ces expressions. Les évaluations paresseuses font partie des fonctionnalités fondamentales de certains langages de programmation.
Naturellement, retarder l'exécution d'expressions jusqu'à ce que leur résultat soit vraiment nécessaire peut rendre les programmes plus rapides.
Le comportement raccourci des opérateurs suivants est conceptuellement similaire aux évaluations paresseuses :
-
l'opérateur || (ou) : la seconde expression est évaluée seulement si la première est fausse (false) :
Sélectionnezif
(
uneExpression
(
)||
peutNePasÊtreÉvaluée
(
)){
// ...
}
-
Si le résultat de uneExpression() est true, le résultat de l'expression || est aussi vrai et la seconde expression n'est pas évaluée ;
-
l'opérateur && (et) : la seconde expression est évaluée seulement si la première est vraie (true) :
Sélectionnezif
(
uneExpression
(
)&&
peutNePasÊtreÉvaluée
(
)){
// ...
}
-
Si le résultat de uneExpression est faux (false), le résultat de l'expression && est également faux et la seconde expression n'est pas évaluée ;
- l'opérateur ternaire ? : soit la première, soit la deuxième expression est évaluée, si la condition est vraie ou fausse, respectivement :
int
i =
condition
(
) ? soitCeci
(
) : soitCela
(
);
La paresse de ces opérateurs n'est pas seulement une question de performance. Parfois, évaluer une des expressions peut être une erreur.
Par exemple, ci-après, vérifier la condition « si la première lettre est A » serait une erreur si la chaîne est vide :
dstring s;
// ...
if
(
s[0
] ==
'A'
) {
// ...
}
Pour pouvoir accéder à l'élément d'indice zéro de s, il faut d'abord s'assurer que la chaîne contient un tel élément. Pour cette raison, la vérification de condition suivante déplace cette expression logique potentiellement erronée du côté droit de l'opérateur && afin de s'assurer qu'elle ne sera évaluée que lorsqu'effectuer cette évaluation sera sans risque :
dstring s;
// ...
if
((
s.length >=
1
) &&
(
s[0
] ==
'A'
)) {
// ...
}
Les évaluations paresseuses peuvent également être effectuées par les pointeurs de fonctions, les déléguées (delegates) et les tranches. Nous verrons cela dans un chapitre ultérieur.