checked 및 unchecked 문(C# 참조)
checked
및 unchecked
문은 정수 계열 형식 산술 연산 및 변환에 대한 오버플로 검사 컨텍스트를 지정합니다. 정수 산술 오버플로가 발생하면 오버플로 검사 컨텍스트가 수행되는 동작을 정의합니다. 검사 컨텍스트인 경우 System.OverflowException이 throw됩니다. 상수 식에서 오버플로가 일어나면 컴파일 시간 오류가 발생합니다. 비검사 컨텍스트에서는 대상 형식에 맞지 않는 상위 비트를 삭제하여 작업 결과가 잘려집니다. 예를 들어 추가의 경우 최댓값에서 최솟값으로 래핑됩니다. 다음 예에서는 확인된 컨텍스트와 확인되지 않은 컨텍스트 모두에서 동일한 작업을 보여 줍니다.
uint a = uint.MaxValue;
unchecked
{
Console.WriteLine(a + 3); // output: 2
}
try
{
checked
{
Console.WriteLine(a + 3);
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
참고 항목
오버플로가 발생한 경우 사용자 정의 연산자 및 변환의 동작은 이전 단락에서 설명한 것과 다를 수 있습니다. 특히 사용자 정의 검사 연산자는 검사 컨텍스트에서 예외를 throw하지 않을 수 있습니다.
자세한 내용은 산술 연산자 문서의 산술 오버플로 및 0으로 나누기 및 사용자 정의 검사 연산자 섹션을 참조하세요.
식에 대한 오버플로 검사 컨텍스트를 지정하려면 다음 예제와 같이 checked
및 unchecked
연산자를 사용할 수도 있습니다.
double a = double.MaxValue;
int b = unchecked((int)a);
Console.WriteLine(b); // output: -2147483648
try
{
b = checked((int)a);
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
checked
및 unchecked
문과 연산자는 다음 예제와 같이 문 블록 또는 연산자의 괄호 안에 ‘텍스트’가 있는 작업에 대한 오버플로 검사 컨텍스트에만 영향을 줍니다.
int Multiply(int a, int b) => a * b;
int factor = 2;
try
{
checked
{
Console.WriteLine(Multiply(factor, int.MaxValue)); // output: -2
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message);
}
try
{
checked
{
Console.WriteLine(Multiply(factor, factor * int.MaxValue));
}
}
catch (OverflowException e)
{
Console.WriteLine(e.Message); // output: Arithmetic operation resulted in an overflow.
}
앞의 예제에서 Multiply
로컬 함수의 첫 번째 호출은 예외가 throw되지 않으므로 checked
문이 Multiply
함수 내의 오버플로 검사 컨텍스트에 영향을 주지 않는다는 것을 보여 줍니다. Multiply
함수의 두 번째 호출에서 함수의 두 번째 인수를 계산하는 식은 검사된 컨텍스트에서 계산되고 checked
문의 블록 내에 텍스트가 포함되므로 예외를 발생시킵니다.
오버플로 검사 컨텍스트의 영향을 받는 작업
오버플로 검사 컨텍스트는 다음 작업에 영향을 줍니다.
피연산자가 정수 형식(즉, 정수 또는 char 형식)이거나 enum 형식인 경우 기본 제공 산술 연산자: unary
++
,--
,-
및 binary+
,-
,*
및/
연산자.정수 형식 사이,
float
또는double
에서 정수 형식으로의 명시적 숫자 변환참고
decimal
값을 정수 형식으로 변환하고 결과가 대상 형식의 범위를 벗어나면 오버플로 검사 컨텍스트에 관계없이 항상 OverflowException이 throw됩니다.C# 11부터는 사용자 정의검사 연산자 및 변환이 있습니다. 자세한 내용은 산술 연산자 문서의 사용자 정의 검사 연산자 섹션을 참조하세요.
기본 오버플로 검사 컨텍스트
오버플로 검사 컨텍스트를 지정하지 않으면 CheckForOverflowUnderflow 컴파일러 옵션의 값이 비상수 식에 대한 기본 컨텍스트를 정의합니다. 기본적으로 이 옵션의 값은 설정되지 않으며 정수 형식 산술 연산 및 변환은 비검사 컨텍스트에서 실행됩니다.
상수 식은 기본적으로 검사 컨텍스트에서 평가되며 오버플로의 경우 컴파일 시간 오류가 발생합니다. unchecked
문 또는 연산자를 사용하여 상수 식에 대해 비검사 컨텍스트를 명시적으로 지정할 수 있습니다.
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.
참고 항목
.NET