C#checkedとuncheckedの使い方

6549 ワード

checkedキーワードは、整数演算および変換に対してオーバーフローチェックを明示的に有効にするために使用されます.
デフォルトでは、式に定数値のみが含まれ、結果として生成された値がターゲット・タイプの範囲外である場合、コンパイラ・エラーが発生します.式に1つ以上の非常数値が含まれている場合、コンパイラはオーバーフローを検出しません.次の例では、i 2に割り当てられた式を計算してもコンパイラエラーは発生しません.
// 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つの正の整数の和として-21748483639が示されています.
オーバーフローチェックは、コンパイラオプション、環境構成、または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("
CHECKED 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
*/
}