2012-11-06 38 views
10

可能重复:
Why don’t languages raise errors on integer overflow by default?为什么C#默认不使用算术溢出检查?

为什么不C#使用算术溢出默认检查?

我认为在发生这种情况时通常会更好地发生异常,这样错误就不会被掩盖。我知道利用发生的'包装'行为有时会很有用,但在这种情况下可以使用关键字unchecked来明确意图。

我希望这个决定是故意做出的,也许是为了提高与其他基于C语言的兼容性。

+2

性能.... – Mysticial

+4

可能出于性能原因 - 溢出检查很慢,在绝大多数情况下不需要。 –

+0

@MichaelPetito,谢谢;这个问题似乎比这个更好,它有很好的答案,所以我认为这应该是封闭的。 – Sam

回答

12

的C#语言规范这样说:

对于非常量表达式(表达式,在 运行时求值),其不被任何checkedunchecked运营 或语句封闭,默认溢出检查的上下文是unchecked 除非外部因素(如编译器切换和执行 环境配置)调用checked评估。

这种选择的原因可能是性能。我同意这个决定会导致那些不知道“无声”整数溢出的人发生错误。

如果您的C#文件属于C#项目文件(*.csproj),则该文件保存“默认”溢出检查上下文的配置。要更改它,请参阅若要在Visual Studio开发环境this page中设置此编译器选项。

如果您不使用.csproj文件,那么您可能正在编译命令行中的所有内容,然后上面的页面会告诉您使用什么命令行选项来设置默认溢出检查上下文。

2

见我的答案在这里类似的问题:Best way to handle Integer overflow in C#?

...有一个定义的 外表现如何检查,未经检查的处理的C#编译器选项:/检查。

默认行为适用于大多数应用程序。对于其他应用程序,其中严格检查应该是默认的,有一个编译器选项来启用这种行为。

+0

感谢您花时间回答,但我问*为什么*而不是*如何*。 – Sam

+0

@Sam感谢downvoting相关的帖子,但对你的问题的微不足道的答案是“因为微软实施了它”...... – 2012-11-06 21:12:25

+1

@ H2CO3不,如果我正在设计一门语言,我也会默认在溢出时进行环绕。为什么?因为溢出检查的性能影响真的是**极端。 – Mysticial