В С# предусмотрено специальное средство, которое связано с генерированием исключений, вызванных переполнением результата в арифметических вычислениях. Например, когда значение арифметического выражения выходит за пределы диапазона, определенного для типа данных выражения. Рассмотрим небольшой фрагмент программы:
static void Main() { byte x = 200; byte y = 200; byte result = (byte) (x + y); Console.WriteLine(result); }
Здесь сумма значений а и b превышает диапазон представления значений типа byte. Следовательно, результат данного выражения не может быть записан в переменную result, тип которой byte.
Для управления подобными исключениями в С# используются операторы checked и unchecked. Чтобы указать, что некоторое выражение должно быть проконтролировано на предмет переполнения, используйте ключевое слово checked. А чтобы проигнорировать переполнение, используйте ключевое слово unchecked. В последнем случае результат будет усечен так, чтобы его тип соответствовал типу-результату выражения.
Можно задать (или отключить) проверку переполнения сразу для всего проекта. Для этого необходимо выполнить следующие действия
Оператор checked имеет две формы:
checked ((тип-выражения) expr)
где expr — выражение, значение которого необходимо контролировать. Если значение контролируемого выражения переполнилось, генерируется исключение типа OverflowException.
checked { // Инструкции, подлежащие проверке. }
Оператор unchecked также имеет две формы:
unchecked ((тип-выражения) expr)
где ехрr — выражение, которое не проверяется на предмет переполнения. В случае переполнения это выражение усекается.
unchecked { // Инструкции, для которых переполнение игнорируется. }
Рассмотрим пример программы, которая демонстрирует использование checked и unchecked.
static void Main() { byte x = 200; byte y = 200; try { byte result = unchecked((byte)(x + y)); Console.WriteLine("1: {0}", result); result = checked((byte)(x + y)); Console.WriteLine("2: ", result); } catch (OverflowException) { Console.WriteLine("возникло переполнение"); } }
Результат выполнения программы:
1: 144 возникло переполнение
В данном примере мы посмотрели, как использовать checked и uncheсked для проверки выражения. А теперь посмотрим, как использовать их для контроля за блоком инструкций.
static void Main() { byte n = 1; byte i; try { unchecked //блок без проверки { for (i = 1; i < 10; i++) n *= i; Console.WriteLine("1: {0}", n); } checked //блок с проверкой { n=1; for (i = 1; i < 10; i++) n *= i; Console.WriteLine("2: ", n); } } catch (OverflowException) { Console.WriteLine("возникло переполнение"); } }
Результат выполнения программы:
1: 128 возникло переполнение