[9-27下午]5.checked,unchecked

Posted on 2009-10-10 14:53  Relax Active  阅读(187)  评论(0)    收藏  举报

checked 关键字用于对整型算术运算和转换显式启用溢出检查。

默认情况下,如果表达式产生的值超出了目标类型的范围,则常数表达式将导致编译时错误,而非常数表达式在运行时计算并将引发异常。不过,如果通过编译器选项或环境配置在全局范围内取消了溢出检查,则可以使用 checked 关键字来启用此项功能。

请参见有关 unchecked 关键字用法的 unchecked 示例。

此示例演示如何对非常数表达式使用 checked。在运行时会报告溢出。
class OverFlowTest
{

    static short x = 32767;   // Max short value
    static short y = 32767;

    // Using a checked expression
    static int CheckedMethod()
    {
        int z = 0;
        try
        {
            z = checked((short)(x + y));
        }
        catch (System.OverflowException e)
        {
            Console.WriteLine(e.ToString());
        }
        return z;
    }

    static void Main()
    {
        Console.WriteLine("Checked output value is: {0}",
                     CheckedMethod());
    }
}
/*
    Output:
    System.OverflowException: Arithmetic operation resulted in an overflow.
       at OverFlowTest.CheckedMethod()
    Checked output value is: 0
*/

unchecked 关键字用于取消整型算术运算和转换的溢出检查。

在未检查的上下文中,如果表达式产生目标类型范围之外的值,则结果被截断。例如:

复制代码
unchecked
{
    int val = 2147483647 * 2;
}
因为上面的计算在 unchecked 块中执行,所以结果对于整数来说太大这一事实被忽略,并且 val 被赋予值 -2。默认情况下,启用溢出检测,这与使用 checked 具有相同的效果。

在上面的示例中,如果省略 unchecked,将产生编译错误,因为表达式使用常数,结果在编译时是已知的。unchecked 关键字还取消对非常数表达式的溢出检测,这是为了避免在运行时导致 OverflowException。

unchecked 关键字还可以用作运算符,如下所示:

复制代码
public int UncheckedAdd(int a, int b)
{
    return unchecked(a + b);
}
  示例
此示例演示如何将 unchecked 语句与常量表达式配合使用。

C# 复制代码
class TestClass
{
    const int x = 2147483647;   // Max int
    const int y = 2;

    static void Main()
    {
        int z;
        unchecked
        {
            z = x * y;
        }
        Console.WriteLine("Unchecked output value: {0}", z);
    }
}
// Output: Unchecked output value: -2


博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3