Операторы C# могут выполняться в проверяемом или непроверяемом контексте. В проверяемом контексте арифметическое переполнение вызовет исключение (ошибку). По умолчанию операторы в C# выполняться в непроверяемом контексте.
Арифметическое переполнение – выход за диапазон допустимых значений определённого типа.
В непроверяемом контексте арифметическое переполнение будет проигнорировано, а результат усечен.
Пример арифметического переполнения:
sbyte a = 127;
a++; // в переменной a будет -128 после инкрементирования (произошло урезание числа)
Для установки проверяемого и непроверяемого контекста используются следующие конструкции:
-
checked
– указание проверяемого контекста; -
unchecked
– указание непроверяемого контекста;
Примеры использования checked и unchecked:
sbyte a = 127;
// Проверять переполнение.
unchecked
{
a++; // Логическая ошибка
}
// 127 + 1 = -128
Console.WriteLine(a);
sbyte b = 127;
// Проверять переполнение.
checked
{
b++; // ОШИБКА уровня компилятора
}
// 127 + 1 = -128
Console.WriteLine(b);
Проверка переполнений применяется в следующих случаях:
- Если используются выражения, использующие предопределенные операторы в целых типах с операциями (
++
,--
,+
,-
,*
,/
). - Если выполняются явные числовые преобразования между целыми типами данных.
Также нужно заметить, что если в большой части кода нужно создать несколько проверяемых контекстов (блоков checked
), в между ними будет находится непроверяемый контекст, то рекомендуется создать один большой проверяемый контекст, а в нём необходимые участки кода поместить в непроверяемый контекст. Например:
sbyte a = 126;
sbyte b = 127;
// Проверять переполнение.
checked
{
a++;
// Не проверять переполнение.
unchecked
{
b++;
}
a++;
}
Данной рекомендации следует додерживаться по двух причинах:
- Открытие нескольких проверяемых контекстов потребует больше ресурсов нежели открытие одного большого проверяемого контекста и в нём нескольких непроверяемых контекстов.
- Каждый открытый проверяемый контекст считается отдельной локальной областью, поэтому локальные переменные созданные в первом проверяемом контексте будут недоступны во втором.
Источник: видеоуроки Александра Шевчука "ВИДЕОУРОК №3. ПЕРЕМЕННЫЕ И ТИПЫ ДАННЫХ"