Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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. L’instruction par défaut est unchecked
. 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, l’addition effectue un retour de la valeur maximale à la valeur minimale. L’exemple suivant montre la même opération dans un contexte vérifié et non vérifié :
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.
}
Remarque
Le comportement de dépassement de capacité des opérateurs et conversions définis par l’utilisateur 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
.
Le comportement de checked
et unchecked
dépend du type et de l’opération. Même pour les entiers, les opérations comme unchecked(x / 0)
lèvent toujours une exception, car il n’existe aucun comportement logique. Vérifiez le comportement du type et de l’opération pour comprendre comment les mots clés checked
et unchecked
influencent votre code.
Types numériques et contexte de vérification de dépassement
Les mots clés checked
et unchecked
s’appliquent principalement aux types entiers où il existe un comportement de dépassement logique. Le comportement de retour où T.MaxValue + 1
devient T.MinValue
est logique dans un système de complément à deux. La valeur représentée n’est pas correcte , car elle ne peut pas tenir dans l’espace de stockage prévu pour ce type. Par conséquent, les bits sont représentatifs des n bits inférieurs du résultat complet.
Pour les types tels que decimal
, float
, double
et Half
qui représentent une valeur plus complexe ou une valeur en complément à un, le retour au début n’est pas logique. Il ne peut pas être utilisé pour calculer des résultats plus volumineux ou plus précis, donc unchecked
n’est pas bénéfique.
float
, double
et Half
ont des valeurs de saturation sensibles pour PositiveInfinity
et NegativeInfinity
, afin de détecter le dépassement de capacité dans un unchecked
contexte. Pour decimal
, de telles limites n’existent pas et atteindre MaxValue
peut entraîner des erreurs ou une confusion. Les opérations qui utilisent decimal
lèvent une exception à la fois dans un contexte checked
et dans un contexte unchecked
.
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 :
Les opérateurs arithmétiques intégrés suivants : opérateurs unaires
++
,--
,-
et binaires+
,-
,*
et/
, quand leurs opérandes sont de type intégral (c’est-à-dire de type intégral numérique ou char) ou de type enum.Conversions numériques explicites entre types intégraux, ou de
float
oudouble
en un type intégral.Remarque
Lorsque vous convertissez une valeur
decimal
en type intégral et que le résultat est en dehors de la plage du type de destination, une exception OverflowException est toujours levée, quel que soit le contexte de contrôle de dépassement.À compter de C# 11, les conversions et les opérateurs vérifiés définis par l’utilisateur. Pour plus d’informations, consultez la section Opérateurs vérifiés définis par l’utilisateur de l’article Opérateurs arithmétiques.
Contexte de contrôle de dépassement par défaut
Si vous ne spécifiez pas le contexte de contrôle de dépassement de capacité, la valeur de l’option du compilateur CheckForOverflowUnderflow définit le contexte par défaut pour les expressions nonconstantes. 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 vérifié et un dépassement de capacité provoque une erreur au moment de la compilation. 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# :
- Les instructions checked et unchecked
- Opérateurs vérifiés et non vérifiés
- Opérateurs vérifiés et non vérifiés définis par l’utilisateur - C# 11