问题 为什么C#默认不使用算术溢出检查? [重复]


可能重复:
为什么语言默认情况下不会在整数溢出上引发错误? 

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

我认为发生异常通常会更好,这样就不会模糊错误。我知道利用发生的'包装'行为偶尔会有用,但是 unchecked 可以在这些情况下使用关键字来明确意图。

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


5311
2017-11-06 21:05


起源

性能.... - Mysticial
可能出于性能原因 - 溢出检查很慢,绝大多数情况下都不需要。 - Richard Deeming
@MichaelPetito,谢谢;这个问题似乎比这个问题好,而且它有很好的答案,所以我认为这应该是关闭的。 - Sam


答案:


C#语言规范说:

对于非常量表达式(在。处计算的表达式)   任何未包含的运行时) checked 要么 unchecked 运营商   或语句,默认溢出检查上下文是 unchecked   除非外部因素(例如编译器切换和执行   环境配置)呼吁 checked 评价。

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

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

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


13
2017-11-06 21:34





在这里查看我对类似问题的回答: 在C#中处理整数溢出的最佳方法是什么?

...有一个C#编译器选项,用于定义表达式之外的方式   处理已检查和未选中:/已检查。

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


2
2017-11-06 21:10



感谢您抽出宝贵时间回答,但我问道 为什么 而不是 怎么样。 - Sam
@Sam感谢您对相关帖子的贬低,但对您的问题的简单回答是“因为微软实施了它”......
@ H2CO3不,如果我正在设计一种语言,我也默认在溢出时回绕。为什么?因为溢出检查的性能影响确实如此 那 极端。 - Mysticial
@Mysticial我没有看到连接......你说的是真的,但为什么/如何合理地回答这个答案呢?
我不是在为downvote说话,我只是说你暗示MS做了它因为他们觉得它不正确。 - Mysticial