我是第一次遇到这个关键字。它有什么作用,应该在什么时候使用?
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/