C# 溢出不起作用?如何启用溢出检查?

19

我在使用C#编程时遇到了一个问题,当我试图将一个非常大的整数变得更大时,它并没有抛出溢出错误,而是直接将该数字设置为可能的最低值(-2,147,483,648)。

我想知道是否可以在Visual Studio中启用溢出检查功能?

1个回答

33

您可以使用以下步骤在Visual Studio中启用算术溢出/下溢检查:

  1. 在解决方案资源管理器中右键单击项目,然后选择属性。
  2. 在构建选项卡上,单击“高级”按钮。 (它在底部)
  3. 选中“检查算术溢出/下溢”复选框。

这将在溢出发生时引发System.OverflowException,而不是通常的操作将值更改为最小值。

如果没有启用算术溢出/下溢:

int test = int.MaxValue;
test++;
//Test should now be equal to -2,147,483,648 (int.MinValue)

启用算术溢出/下溢:

int test = int.MaxValue;
test++;
//System.OverflowException thrown

使用 checked 块:

checked
{
    int test = int.MaxValue;
    test++;
    //System.OverflowException thrown
}

checked 的文档可以在此处查看。(感谢 Sasha 提醒我)


12
您可以使用checked关键字将一个语句或一组语句包裹起来,以便明确检查它们是否存在算术溢出。设置项目范围的属性有些风险,因为在很多情况下,溢出是一个相当合理的预期。 - Sasha Goldshtein
2
请注意,此编译器选项仅适用于代码中没有显式的checkedunchecked上下文的情况。此外,它将影响生成的可执行文件,而不仅仅是在 Visual Studio 中进行调试。有关文档,请参见此处:http://msdn.microsoft.com/en-us/library/h25wtyxf%28v=VS.100%29.aspx - Justin
不错的观点,Sasha - 我正在查找有关checked语句的简短博客 :) 链接很快就会跟上。 - Rion Williams
5
请注意,如果您只想检查表达式的一部分而不是整个语句或一组语句,则可以在表达式上下文中使用"checked"。 - Eric Lippert
如果我对这个编译选项的理解是正确的,它会影响应用设置的程序集。即使另一个具有不同设置的程序集调用它,它也不会被覆盖。那么对于像mscorlib.dll这样的系统程序集呢?如果我们将长值传递给int方法参数,它们会抛出异常吗?如果我只有一个dll,我怎么知道“检查溢出”设置是什么? - Joy George Kunjikkuru
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接