checked & unchecked

Références

L'actualité

Librairie

L'information

Introduction

Les instructions C# peuvent s'exécuter dans un contexte vérifié (checked) ou non vérifié (unchecked). Dans un contexte vérifié, un dépassement de capacité arithmétique lève une exception. Dans un contexte non vérifié (unchecked), ce dépassement de capacité arithmétique est ignoré et le résultat est tronqué en supprimant tous les bits de poids fort qui ne tiennent pas dans le type destinataire.

  • checked indique un contexte vérifié.
  • unchecked indique un contexte non vérifié.

Les opérations suivantes sont concernées par la vérification du dépassement de capacité :

  • Expressions utilisant les opérateurs prédéfinis suivants dans des types intégraux :
    ++, --, unaire -, +, -, *, /
  • Conversions numériques explicites entre types intégraux, ou de float ou double en un type intégral.

Si ni checked ni unchecked ne sont spécifiés, le contexte par défaut pour les expressions non constantes (expressions évaluées au moment de l'exécution) est défini par la valeur de l'option -checked compilateur. Par défaut, la valeur de cette option n'est pas définie et les opérations arithmétiques sont exécutées dans un contexte non vérifié (unchecked).

Pour les expressions constantes (expressions pouvant être complètement évaluées au moment de la compilation), le contexte par défaut est toujours vérifié (checked). Sauf si une expression constante est placée explicitement dans un contexte non vérifié (unchecked), les dépassements de capacité qui se produisent pendant l'évaluation lors de la compilation de l'expression entraînent des erreurs au moment de la compilation.

checked

Le mot clé checked permet d'activer explicitement le contrôle de dépassement de capacité pour les conversions et les opérations arithmétiques de type intégral.

Par défaut, une expression qui contient uniquement des valeurs constantes provoque une erreur du compilateur si l'expression produit une valeur située en dehors de la plage du type de destination. Si l'expression contient une ou plusieurs valeurs non constantes, le compilateur ne détecte pas le dépassement de capacité. L'évaluation de l'expression assignée à i2 dans l'exemple suivant ne provoque pas d'erreur du compilateur.

Par défaut, ces expressions non constantes ne font pas l'objet d'une vérification d'un dépassement de capacité au moment de l'exécution et ne lèvent aucune exception de dépassement de capacité. L'exemple précédent affiche -2 147 483 639 comme somme de deux entiers positifs.

Le contrôle de dépassement de capacité peut être activé par les options du compilateur, la configuration de l'environnement ou l'utilisation du mot clé checked. Les exemples suivants montrent comment utiliser une expression checked ou un bloc checked pour détecter le dépassement de capacité produit par la somme précédente au moment de l'exécution. Les deux exemples lèvent une exception de dépassement de capacité.

Vous pouvez utiliser le mot clé unchecked pour empêcher la vérification du dépassement de capacité.

Exemple

Cet exemple montre comment utiliser checked pour activer la vérification du dépassement de capacité au moment de l'exécution.


unchecked

Le mot clé unchecked permet de supprimer le contrôle de dépassement de capacité pour les conversions et les opérations arithmétiques de type intégral.

Dans un contexte non vérifié (unchecked), si une expression produit une valeur située hors de la plage du type de destination, le dépassement de capacité n'est pas signalé. Par exemple, comme le calcul dans l'exemple suivant s'effectue dans un bloc ou une expression unchecked, le fait que le résultat est trop grand pour un entier est ignoré et int1 se voit assigner la valeur -2,147,483,639.

Si l'environnement unchecked est supprimé, une erreur de compilation se produit. Le dépassement de capacité peut être détecté au moment de la compilation, car tous les termes de l'expression sont des constantes.

Les expressions qui contiennent des termes non constants sont non vérifiées par défaut au moment de la compilation et de l'exécution. Étant donné que la vérification de dépassement de capacité prend du temps, l'utilisation de code non vérifié dans les situations où il n'existe aucun danger de dépassement de capacité peut améliorer les performances. Toutefois, si un dépassement de capacité est possible, il convient d'utiliser un environnement vérifié (checked).

Exemple

L'exemple de code suivant montre comment utiliser le mot clé unchecked.