【问题标题】:Why doesn't C# use arithmetic overflow checking by default? [duplicate]为什么 C# 默认不使用算术溢出检查? [复制]
【发布时间】:2012-10-26 21:36:29
【问题描述】:

可能重复:
Why don’t languages raise errors on integer overflow by default?

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

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

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

【问题讨论】:

  • 可能出于性能原因 - 溢出检查很慢,并且在绝大多数情况下不需要。
  • @MichaelPetito,谢谢;这个问题似乎比这个问题好,而且答案很好,所以我认为应该关闭。

标签: c# math overflow checked


【解决方案1】:

C# 语言规范是这样说的:

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

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

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

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

【讨论】:

    【解决方案2】:

    在此处查看我对类似问题的回答:Best way to handle Integer overflow in C#?

    ... 有一个 C# 编译器选项,它定义了表达式之外的 已选中和未选中被处理:/checked。

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

    【讨论】:

    • 感谢您抽出宝贵时间回答,但我问的是为什么而不是如何
    • @Sam 感谢您对相关帖子投反对票,但对您的问题的简单回答是“因为 Microsoft 实现了它”...
    • @H2CO3 不,如果我正在设计一种语言,我也会默认在溢出时环绕。为什么?因为溢出检查对性能的影响真的是极端。
    • 我不是在代表反对票,我只是说你暗示 MS 这样做是因为他们觉得这不正确。
    • @supercat 问题是没有办法有效地实现线程静态标志。至少在 x86 上,有一个标志寄存器在溢出时设置。但这几乎被所有操作所覆盖。因此,您需要在大多数指令之后获取并保存该标志位 - 在这种情况下,您只是添加了您试图避免的所有开销。检查算术有效的唯一方法是它是否在硬件中实现。但任何主流处理器都不是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2011-09-15
    • 1970-01-01
    • 2012-02-19
    • 2016-05-13
    相关资源
    最近更新 更多