A quoi sert le mot clé “vérifié” C #?

Je viens de tomber sur ce mot-clé pour la première fois. Que fait-il et quand doit-il être utilisé?

int multiply(int i, int j) { return checked(i * j); } 

Eric Lippert a publié un article en deux parties intitulé “À quoi sert le mot clé non vérifié?”: Partie 1 – Partie 2


“Checked” est un mot clé de bloc qui active la vérification du dépassement de capacité arithmétique. Normalement, si une opération entière dépasse la valeur maximale ou minimale que le type peut gérer, l’opération continue malgré tout et le résultat se répète simplement comme un compteur kilomésortingque. Donc, par exemple:

 byte b = byte.MaxValue; Console.WriteLine(b); // 255 (11111111) Console.WriteLine(++b); // 0 (00000000) 

Le fait de placer cet extrait de code dans un bloc checked empêche le débordement et au lieu de cela, le moteur d’exécution lève une OverflowException :

 checked { byte b = byte.MaxValue; Console.WriteLine(b); // b=255 try { Console.WriteLine(++b); } catch (OverflowException e) { Console.WriteLine(e.Message); // "Arithmetic operation resulted in an overflow." // b = 255 } } 

Et comme il existe une option du compilateur /checked , qui active le contrôle du compilateur par défaut, il existe également le mot clé unchecked qui empêche la vérification du débordement.


En ce qui concerne l’utilisation, la vérification de débordement doit être utilisée avec parcimonie, comme c’est le cas pour la gestion des exceptions en général . Pour détecter un dépassement de capacité au moment de l’exécution, il est nettement plus rapide (comme un ordre de grandeur) d’effectuer une vérification simple plutôt que d’activer la vérification du dépassement de capacité:

 int multiply(int i, int j) { if ((long)int * (long)j > int.MaxValue) throw new InvalidOperationException("overflow"); return i*j; } 

Vous pouvez le faire même pour Int64 / long, en utilisant BigInteger (cela peut être encore au moins un ordre de grandeur plus rapide que d’utiliser checked ):

 long multiply(long i, long j) { if (new System.Numerics.BigInteger(i) + j > long.MaxValue) throw new InvalidOperationException("overflow"); return i*j; } 

Il existe également un bon article de Code Project sur ce sujet qui explique certaines mises en garde (par exemple, la vérification de débordement ne concerne que le bloc de code immédiat, pas les appels de fonction à l’intérieur du bloc).