Урок 3. Проверка и запрет проверки переполнения (checked и unchecked)

Операторы 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);

Проверка переполнений применяется в следующих случаях:

  1. Если используются выражения, использующие предопределенные операторы в целых типах с операциями (++, --, +, -, *, /).
  2. Если выполняются явные числовые преобразования между целыми типами данных.

Также нужно заметить, что если в большой части кода нужно создать несколько проверяемых контекстов (блоков checked), в между ними будет находится непроверяемый контекст, то рекомендуется создать один большой проверяемый контекст, а в нём необходимые участки кода поместить в непроверяемый контекст. Например:

sbyte a = 126;
sbyte b = 127;

// Проверять переполнение.
checked
{
    a++;
    // Не проверять переполнение.
    unchecked
    {
        b++; 
    }
    a++;
}

Данной рекомендации следует додерживаться по двух причинах:

  1. Открытие нескольких проверяемых контекстов потребует больше ресурсов нежели открытие одного большого проверяемого контекста и в нём нескольких непроверяемых контекстов.
  2. Каждый открытый проверяемый контекст считается отдельной локальной областью, поэтому локальные переменные созданные в первом проверяемом контексте будут недоступны во втором.

Источник: видеоуроки Александра Шевчука "ВИДЕОУРОК №3. ПЕРЕМЕННЫЕ И ТИПЫ ДАННЫХ"

%D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B0%20%D0%B2%D0%BB%D0%B5%D0%B2%D0%BE%202 предыдущая статья | следующая статья %D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%BA%D0%B0%20%D0%B2%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%202