Обработка переполнения в C#

C#   8 февраля 2012  Автор статьи:  

Очень часто при выполнении арифметических операции, разработчик может столкнуться с проблемой переполнения. Она возникает, когда получившийся размер переменной не умещается в памяти, отведенной для данного типа данных. Например:

Byte b = 100;
b = (Byte) (b + 200); // После этого b равно 44 (или в шестнадцатеричной системе – 2C).

В данном случае мы имеем дело как раз с переполнением. Иногда переполнение запланировано разработчиком, например, при вычислении контрольных сумм, но чаще всего данные операции приводят к непредсказуемым последствиям. Многие компиляторы не считают переполнения ошибкой и просто обрезают значения как в нашем примере. Но в C# существует возможность контролировать переполнения. Например, мы можем добавить в командной строке параметр /checked+, таким образом, мы включим обработку переполнений, этим мы сообщим компилятору, что для выполнения команд сложения, умножения, вычитания, преобразования, должны быть сгенерированы команды проверки переполнения, и при его возникновении мы получим исключение OverflowException, что позволит нам обработать данное исключение. Но не стоит забывать о том, что при использовании данного параметра выполнение кода заметно замедлится, так как компилятор будет затрачивать дополнительное время для проверки на переполнение. Но программисту вряд ли подойдет такой способ, так как он включает или выключает переполнение во всем коде. Для проверки в отдельных местах существуют специальные операторы checked и unchecked.

Byte b = 100;
b = checked((Byte) (b + 200)); // Генерируется OverflowException.

Так же мы можем создавать блоки, в которых будет проходить проверка:

checked { // Начало проверяемого блока.
Byte b = 100;
b = (Byte) (b + 200); // Это выражение проверяется на переполнение.
} // Конец проверяемого блока.

Аналогично в блоке unchecked проверка переполнения выполняться не будет.
В заключении могу порекомендовать использовать параметр /checked+ , при тестировании проекта, в этом случае проверка будет проводиться во всем кода, если он не помечен как unchecked. При выпуске же финальной версии желательно использовать параметр /checked-.

Научиться программировать

  • на Delphi

  • на Java

  • на C++