c# - C# "checked"关键字有什么用?

标签 c#

我是第一次遇到这个关键字。它有什么作用,应该在什么时候使用?

int multiply(int i, int j)
{
    return checked(i * j);
}

最佳答案

Eric Lippert 有一篇分为两部分的博文“未检查的关键字有什么用?”:Part 1 -- Part 2


"Checked"是启用算术溢出检查的 block 关键字。通常,如果整数运算超过了该类型可以处理的最大值或最小值,运算仍然会继续进行,结果就像里程表一样循环。所以,例如:

byte b = byte.MaxValue;
Console.WriteLine(b);       // 255  (11111111)
Console.WriteLine(++b);     // 0    (00000000)

将此代码段放在 checked block 中可防止溢出,而运行时会抛出 OverflowException。 :

checked
{
    byte b = byte.MaxValue;
    Console.WriteLine(b);               // b=255
    try
    {
        Console.WriteLine(++b);
    }
    catch (OverflowException e)
    {
        Console.WriteLine(e.Message);   // "Arithmetic operation resulted in an overflow." 
                                        // b = 255
    }
}

因为有一个编译器选项 /checked ,默认情况下打开编译器检查,还有 unchecked防止溢出检查的关键字。


就用法而言,应谨慎使用溢出检查,as is true of exception handling in general .要在运行时检查溢出,进行简单检查比打开溢出检查要快得多(例如一个数量级):

int multiply(int i, int j)
{ 
    if ((long)i * (long)j > int.MaxValue)
        throw new InvalidOperationException("overflow");
    return i*j;
}

您甚至可以使用 BigInteger 对 Int64/long 执行此操作(这至少比使用 checked 快一个数量级):

long multiply(long i, long j)
{ 
    if (new System.Numerics.BigInteger(i) + j > long.MaxValue)
        throw new InvalidOperationException("overflow");
    return i*j;
}

还有一个不错的Code Project关于此的文章解释了一些注意事项(例如,溢出检查仅适用于直接代码块,不适用于 block 内的任何函数调用)。

关于c# - C# "checked"关键字有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709495/

相关文章:

c# - 无法为 ExpandoObject 赋值

C# 何时设置具有默认值的实例变量?

c# - Visual C# Winforms 数据库问题

c# - Tcp 服务器/客户端应用程序与其他 PC 通信

c# - 嵌套中继器产生 "malformed server tag"?

c# - Windows 应用商店应用程序中的 System.Environment 替换?

c# - 如何使用 UIElement 依赖属性实现 WPF 用户控件?

c# - 类型化和非类型化数据集的 LINQ 和性能?

c# - 具有通用 ID 的通用存储库 - 如何在 int 时检索

c# - WinForms 文本框中的换行符