checked 關鍵字用於對整型算術運算和轉換顯式啟用溢出檢查。
默認情況下,如果表達式僅包含常數值,且產生的值在目標類型范圍之外,則它會導致編譯器錯誤。 如果表達式包含一個或多個非常數值,則編譯器不檢測溢出。 在下面的示例中,計算賦給 i2 的表達式不會導致編譯器錯誤。
// The following example causes compiler error CS0220 because 2147483647 // is the maximum value for integers. //int i1 = 2147483647 + 10; // The following example, which includes variable ten, does not cause // a compiler error. int ten = 10; int i2 = 2147483647 + ten; // By default, the overflow in the previous statement also does // not cause a run-time exception. The following line displays // -2,147,483,639 as the sum of 2,147,483,647 and 10. Console.WriteLine(i2);
默認情況下,在運行時也不檢查這些非常數表達式是否溢出,這些表達式不引發溢出異常。 上面的示例顯示 -2,147,483,639 作為兩個正整數之和。
可以通過編譯器選項、環境配置或使用 checked 關鍵字來啟用溢出檢查。 下面的示例演示如何使用 checked 表達式或 checked 塊,在運行時檢測由前面的求和計算導致的溢出。 兩個示例都引發溢出異常。
// If the previous sum is attempted in a checked environment, an
// OverflowException error is raised.
// Checked expression.
Console.WriteLine(checked(2147483647 + ten));
// Checked block.
checked
{
int i3 = 2147483647 + ten;
Console.WriteLine(i3);
}
可以使用unchecked取消溢出檢查
此示例演示如何使用 checked 啟用運行時溢出檢查。
class OverFlowTest
{
// Set maxIntValue to the maximum value for integers.
static int maxIntValue = 2147483647;
// Using a checked expression.
static int CheckedMethod()
{
int z = 0;
try
{
// The following line raises an exception because it is checked.
z = checked(maxIntValue + 10);
}
catch (System.OverflowException e)
{
// The following line displays information about the error.
Console.WriteLine("CHECKED and CAUGHT: " + e.ToString());
}
// The value of z is still 0.
return z;
}
// Using an unchecked expression.
static int UncheckedMethod()
{
int z = 0;
try
{
// The following calculation is unchecked and will not
// raise an exception.
z = maxIntValue + 10;
}
catch (System.OverflowException e)
{
// The following line will not be executed.
Console.WriteLine("UNCHECKED and CAUGHT: " + e.ToString());
}
// Because of the undetected overflow, the sum of 2147483647 + 10 is
// returned as -2147483639.
return z;
}
static void Main()
{
Console.WriteLine("\nCHECKED output value is: {0}",
CheckedMethod());
Console.WriteLine("UNCHECKED output value is: {0}",
UncheckedMethod());
}
/*
Output:
CHECKED and CAUGHT: System.OverflowException: Arithmetic operation resulted
in an overflow.
at ConsoleApplication1.OverFlowTest.CheckedMethod()
CHECKED output value is: 0
UNCHECKED output value is: -2147483639
*/
}