Instructions checked et unchecked (informations de référence sur C#)

Les instructions checked et unchecked spécifient le contexte de vérification de dépassement pour les opérations arithmétiques et les conversions de type intégral. En cas de dépassement arithmétique d’un entier, le contexte de vérification de dépassement définit ce qui doit se produire. Dans un contexte vérifié, une exception System.OverflowException est levée. Si le dépassement se produit dans une expression constante, une erreur de compilation se produit. Dans un contexte non vérifié, le résultat de l’opération est tronqué en supprimant tous les bits de poids fort qui ne tiennent pas dans le type destinataire. Par exemple, dans le cas d’une addition, un cycle complet est effectué pour revenir à la valeur minimale après avoir dépassé la valeur maximale. L’exemple suivant montre la même opération dans un contexte checked et unchecked :

uint a = uint.MaxValue;

unchecked
{
    Console.WriteLine(a + 3);  // output: 2
}

try
{
    checked
    {
        Console.WriteLine(a + 3);
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

Notes

Le comportement des conversions et des opérateurs définis par l’utilisateur en cas de dépassement peut différer de celui décrit dans le paragraphe précédent. En particulier, les opérateurs vérifiés définis par l’utilisateur peuvent ne pas lever d’exception dans un contexte vérifié.

Pour plus d’informations, consultez les sections Débordement arithmétique et division par zéro et Opérateurs vérifiés définis par l’utilisateur de l’article Opérateurs arithmétiques.

Pour spécifier le contexte de contrôle de dépassement pour une expression, vous pouvez également utiliser les opérateurs checked et unchecked, comme le montre l’exemple suivant :

double a = double.MaxValue;

int b = unchecked((int)a);
Console.WriteLine(b);  // output: -2147483648

try
{
    b = checked((int)a);
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

Les instructions checked et unchecked et les opérateurs affectent uniquement le contexte de contrôle de dépassement pour les opérations qui se trouvent textuellement dans le bloc d’instructions ou les parenthèses de l’opérateur, comme le montre l’exemple suivant :

int Multiply(int a, int b) => a * b;

int factor = 2;

try
{
    checked
    {
        Console.WriteLine(Multiply(factor, int.MaxValue));  // output: -2
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);
}

try
{
    checked
    {
        Console.WriteLine(Multiply(factor, factor * int.MaxValue));
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

Dans l’exemple précédent, le premier appel de la fonction locale Multiply montre que l’instruction checked n’affecte pas le contexte de contrôle de dépassement dans la fonction Multiply, car aucune exception n’est levée. Lors de la deuxième invocation de la fonction Multiply, l’expression qui calcule le deuxième argument de la fonction est évaluée dans un contexte vérifié et génère une exception car elle se trouve textuellement à l’intérieur du bloc de l’instruction checked.

Opérations affectées par le contexte de contrôle de dépassement

Le contexte de contrôle de dépassement affecte les opérations suivantes :

Contexte de contrôle de dépassement par défaut

Si vous ne spécifiez pas le contexte de contrôle de dépassement, la valeur de l’option de compilateur CheckForOverflowUnderflow définit le contexte par défaut pour les expressions non constantes. Par défaut, la valeur de cette option n’est pas définie et les conversions et opérations arithmétiques de type intégral sont exécutées dans un contexte non vérifié (unchecked).

Les expressions constantes sont évaluées par défaut dans un contexte checked, et une erreur de compilation se produit en cas de dépassement. Vous pouvez spécifier explicitement un contexte non vérifié pour une expression constante avec l’instruction ou l’opérateur unchecked.

spécification du langage C#

Pour plus d’informations, consultez les sections suivantes de la spécification du langage C# :

Voir aussi