проверка и un проверка ed statements (справочник по C#)
unchecked
Инструкции checked
указывают контекст переполнения проверка для арифметических операций и преобразований целочисленного типа. Когда происходит арифметическое арифметическое переполнение, контекст переполнения проверка определяет, что происходит. В проверка контексте возникает исключение; System.OverflowException если переполнение происходит в константном выражении, возникает ошибка во время компиляции. В не проверка контексте результат операции усечен карта любых битов высокого порядка, которые не соответствуют типу назначения. Например, в случае сложения он упаковывается из максимального значения к минимальному значению. В следующем примере показана одна и та же операция как в проверка, так и в контексте без изменений проверка:
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.
}
Примечание.
Поведение определяемых пользователем операторов и преобразований в случае переполнения может отличаться от того, что описано в предыдущем абзаце. В частности, определяемые пользователем операторы проверка могут не вызывать исключение в проверка контексте.
Дополнительные сведения см. в разделах арифметического переполнения и деления по нулю и определяемым пользователем проверка операторам статьи арифметических операторов.
Чтобы указать контекст переполнения проверка для выражения, можно также использовать 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.
}
В предыдущем примере первый вызов локальной функции показывает, что checked
инструкция не влияет на контекст Multiply
переполнения Multiply
проверка в функции, так как исключение не возникает. При втором вызове Multiply
функции выражение, вычисляющее второй аргумент функции, вычисляется в проверка контексте и приводит к исключению в текстовом виде внутри блока инструкцииchecked
.
Операции, затронутые контекстом переполнения проверка
Контекст переполнения проверка влияет на следующие операции:
Следующие встроенные арифметические операторы: унарные
++
,--
-
и двоичные+
-
,*
и/
операторы, когда их операнды имеют целочисленный тип (то есть целочисленный или тип символа) или тип перечисления.Явные числовые преобразования между целочисленными типами или от или
double
доfloat
целочисленного типа.Примечание.
При преобразовании
decimal
значения в целочисленный тип и результат находится за пределами диапазона целевого типа, OverflowException всегда создается независимо от контекста переполнения проверка.Начиная с C# 11 определяемые пользователем проверка операторы и преобразования. Дополнительные сведения см. в разделе Проверенные операторы, определяемые пользователем статьи Арифметические операторы.
Контекст переполнения проверка по умолчанию
Если контекст переполнения проверка не указан, значение параметра компилятора CheckForOverflowUnderflow определяет контекст по умолчанию для неконстантных выражений. По умолчанию значение этого параметра не задано, а арифметические операции целочисленного типа и преобразования выполняются в не проверка контексте.
Константные выражения оцениваются по умолчанию в проверка контексте, а в случае переполнения возникает ошибка во время компиляции. Вы можете явно указать контекст без проверка для константного выражения с оператором или операторомunchecked
.
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:
- Операторы checked и unchecked
- Операторы checked и unchecked
- Определяемые пользователем проверка и un проверка ed операторы — C# 11