C#检查块

Yoc*_*mer 22 c# checked

有人可以向我解释一下,检查一个未经检查的块究竟是什么?
我什么时候应该使用它们?

Mar*_*ell 38

算术溢出; 例如:

int i = int.MaxValue -10;
checked {       
   i+= 20; // boom: OverflowException
           // "Arithmetic operation resulted in an overflow."
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ Si8 nope; 这里的全部要点是**导致错误; 默认情况下,c#使用未经检查的算术,因此溢出会以静默方式发生.如果它从不抛出,添加try/catch将不会执行任何操作.它正在添加`checked`*使它在溢出时抛出* (4认同)

Unm*_*kar 13

来自MSDN

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

简而言之,它们用于定义算术运算发生的上下文.在checked上下文中,当发生溢出时抛出异常.在未经检查的上下文中,不会抛出异常,而是将值换行.

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

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

  • 当你想要溢出时,未经检查的块是好的,就像计算哈希码时一样. (2认同)

osh*_*csd 5

checked块用于处理算术溢出/下溢情况.举个例子:

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

由于这个原因,短变量不能具有int变量可以具有的所有可能值.如果有些如何,可以按以下示例进行投射:

                int y = 1000000000;
                short x = (short)y;
Run Code Online (Sandbox Code Playgroud)

显然,您可以看到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");
        }
Run Code Online (Sandbox Code Playgroud)

catch块导致抛出溢出异常,如果cast导致溢出/下溢的情况.在这种情况下,它显示错误消息

"嘿,我们遇到溢出/下溢的情况"

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