Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the C# "checked" keyword for?

Tags:

c#

I just came across this keyword for the first time. What does it do, and when should it be used?

int multiply(int i, int j) {     return checked(i * j); } 
like image 413
McGarnagle Avatar asked Dec 20 '13 18:12

McGarnagle


People also ask

What is C used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is C language in simple words?

C is a structured, procedural programming language that has been widely used both for operating systems and applications and that has had a wide following in the academic community. Many versions of UNIX-based operating systems are written in C.

What is a program in C?

C Program to Find the Factorial of a Number. Career Prospects. The C programming language is a general-purpose, operating system-agnostic, and procedural language that supports structured programming and provides low-level access to the system memory.


1 Answers

Eric Lippert has a two-part blog post "What is the unchecked keyword good for?": Part 1 -- Part 2


"Checked" is a block keyword that enables arithmetic overflow checking. Normally, if an integer operation exceeds the maximum or minimum value that the type can handle, the operation proceeds anyway, and the result just cycles like an odometer. So, for example:

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

Placing this snippet in a checked block prevents the overflow, and instead the runtime throws an 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     } } 

And since there's a compiler option /checked, which turns compiler checking on by default, there is also the unchecked keyword which prevents overflow checking.


As far as usage, overflow checking should be used sparingly, as is true of exception handling in general. To check for an overflow at runtime, it's significantly faster (like, an order of magnitude) to do a simple check, rather than to turn on overflow checking:

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

You can do this even for Int64/long, using BigInteger (this can be still at least an order of magnitude faster than using checked):

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

There's also a good Code Project article on this that explains some caveats (eg, the overflow check only applies to the immediate code block, not to any function calls inside the block).

like image 153
McGarnagle Avatar answered Sep 19 '22 13:09

McGarnagle