C# Language coché, non coché


Exemple

Les mots clés checked et unchecked checked définissent la manière dont les opérations gèrent les dépassements mathématiques. Le "dépassement" dans le contexte des mots-clés checked et unchecked se produit lorsqu'une opération arithmétique de type entier génère une valeur dont l'amplitude est supérieure à celle que le type de données cible peut représenter.

Lorsque le débordement se produit dans un bloc checked (ou lorsque le compilateur est configuré pour utiliser l'arithmétique vérifiée globalement), une exception est émise pour avertir d'un comportement indésirable. Pendant ce temps, dans un bloc unchecked , le dépassement de capacité est silencieux: aucune exception n'est levée et la valeur est simplement contournée par la limite opposée. Cela peut conduire à des bogues subtils et difficiles à trouver.

Comme la plupart des opérations arithmétiques sont effectuées sur des valeurs trop petites ou trop grandes pour déborder, la plupart du temps, il n'est pas nécessaire de définir explicitement un bloc comme checked . Des précautions doivent être prises lors du calcul arithmétique sur des entrées non limitées susceptibles de provoquer un débordement, par exemple lors du calcul arithmétique dans des fonctions récursives ou lors de la saisie d’une entrée utilisateur.

Ni checked ni unchecked n'affecte les opérations arithmétiques en virgule flottante.

Lorsqu'un bloc ou une expression est déclaré unchecked , toutes les opérations arithmétiques qu'il contient sont autorisées à déborder sans provoquer d'erreur. Un exemple où ce comportement est souhaité serait le calcul d'une somme de contrôle, où la valeur est autorisée à "boucler" pendant le calcul:

byte Checksum(byte[] data) {
    byte result = 0;
    for (int i = 0; i < data.Length; i++) {
        result = unchecked(result + data[i]); // unchecked expression
    }
    return result;
}

L'une des utilisations les plus courantes de la object.GetHashCode() unchecked est l'implémentation d'une substitution personnalisée pour object.GetHashCode() , un type de somme de contrôle. Vous pouvez voir l'utilisation du mot clé dans les réponses à cette question: Quel est le meilleur algorithme pour un System.Object.GetHashCode surchargé? .

Lorsqu'un bloc ou une expression est déclaré comme checked , toute opération arithmétique qui provoque un dépassement entraîne une OverflowException .

int SafeSum(int x, int y) {
    checked { // checked block
        return x + y; 
    }
}

Les deux cochés et non cochés peuvent être sous forme de bloc et d'expression.

Les blocs cochés et non contrôlés n'affectent pas les méthodes appelées, seuls les opérateurs appelés directement dans la méthode actuelle. Par exemple, les Enum.ToObject() , Convert.ToInt32() et les opérateurs définis par l'utilisateur ne sont pas affectés par les contextes vérifiés / non vérifiés personnalisés.

Remarque : Le comportement par défaut du débordement par défaut (coché ou non) peut être modifié dans les propriétés du projet ou via le commutateur de ligne de commande / checked [+ | -] . Il est courant de vérifier les opérations pour les versions de débogage et de les désactiver pour les versions validées. Les mots clés checked et unchecked checked unchecked seraient alors utilisés que lorsqu'une approche par défaut ne s'applique pas et que vous avez besoin d'un comportement explicite pour garantir l'exactitude.