23

有人可以向我解释检查未检查块到底是什么吗?
我应该什么时候使用每个?

4

3 回答 3

39

算术溢出;例如:

int i = int.MaxValue -10;
checked {       
   i+= 20; // boom: OverflowException
           // "Arithmetic operation resulted in an overflow."
}

因此checked,当您不希望意外溢出/环绕成为问题并且宁愿看到异常时使用。

unchecked显式设置模式以允许溢出;除非您以其他方式告诉编译器,否则默认值是unchecked- 通过代码(上面)或编译器开关(/checked在 csc 中)。

于 2011-03-07T09:27:40.093 回答
13

来自MSDN

C# 语句可以在选中或未选中的上下文中执行。在检查的上下文中,算术溢出会引发异常。在未经检查的上下文中,算术溢出被忽略并且结果被截断。

简而言之,它们用于定义算术运算发生的上下文。在检查的上下文中,发生溢出时会引发异常。在未经检查的上下文中,不会引发异常,而是将值环绕。

现在,您的上下文是未检查还是检查取决于您的编译器选项。因此,如果您想手动覆盖上下文,即在未检查的上下文中执行检查操作,反之亦然,您应该使用这些关键字。

有关更多详细信息和示例,请点击上面给出的链接。

于 2011-03-07T09:26:39.020 回答
7

检查块用于处理算术上溢/下溢情况。例如:

假设您要将 int 值转换为 short 类型值(称为窄化转换)。int 类型变量的取值范围为 -2,147,483,648 到 2,147,483,647。但空头只能从 -32,768 到 32,767。

由于这个原因,短变量不能具有 int 变量可以具有的所有可能值。如果某种方式,可以转换为以下示例:

                int y = 1000000000;
                short x = (short)y;

显然,您可以看到 y 的值在短变量的有效值之外。于是就发生了算术溢出的情况。

默认情况下,C# 不会对上述代码抛出任何异常。但是有几种方法可以引发异常并处理它。在这种情况下,检查块会派上用场

        try
        {
            checked
            {
                int y = 1000000000;
                short x = (short)y;
            }
        }
        catch (OverflowException ex)
        {
            MessageBox.Show("hey, we got a overflow/underflow situation");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error");
        }

如果强制转换导致溢出/下溢情况,catch 块会引发溢出异常。在这种情况下,它会显示错误消息

“嘿,我们遇到了上溢/下溢的情况”

如果我们想在转换发生时丢弃下溢/溢出并继续操作,则使用未检查块。

于 2015-04-02T05:29:11.750 回答