Why doesn't C# use arithmetic overflow checkin

2019-01-09 14:51发布

问题:

Possible Duplicate:
Why don’t languages raise errors on integer overflow by default?

Why doesn't C# use arithmetic overflow checking by default?

I figure that it would generally be better to have exceptions occur when this occurs so that errors aren't obscured. I know that it's occasionally useful to take advantage of the 'wrapping' behaviour that occurs, but the unchecked keyword could be used in these circumstances to make the intentions explicit.

I expect that this decision was made intentionally, perhaps to increase compatibility with other C-based languages.

回答1:

The C# Language Specification says this:

For non-constant expressions (expressions that are evaluated at run-time) that are not enclosed by any checked or unchecked operators or statements, the default overflow checking context is unchecked unless external factors (such as compiler switches and execution environment configuration) call for checked evaluation.

The reason for this choice is probably performance. I agree that this decision leads to errors among those who are not aware of "silent" integer overflow.

If your C# files belong to a C# project file (*.csproj), then that file holds configuration of the "default" overflow checking context. To changed it, see To set this compiler option in the Visual Studio development environment in this page.

If you don't use .csproj files, you're probably compiling everything from the command line, and then the above page tells you what command line option to use to set the default overflow checking context.



回答2:

See my answer to similar question here: Best way to handle Integer overflow in C#?

... there is a C# compiler option that defines how expressions outside of checked and unchecked are handled: /checked.

The default behavior is suitable for most applications. For other applications, where strict checking should be the default, there is a compiler option to enable such behavior.