Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы по Технологии программирования / Использование ключевых слов checked и unchecked

.docx
Скачиваний:
6
Добавлен:
21.05.2015
Размер:
8.08 Кб
Скачать

В С# предусмотрено специальное средство, которое связано с генерированием исключений, связанных с переполнением в арифметических вычислениях. Как вы знаете, в некоторых случаях при вычислении арифметических выражений получается результат, который выходит за пределы диапазона, определенного для типа данных в выражении. В этом случае говорят, что произошло переполнение результата. Рассмотрим, например, такой фрагмент программы:

bytea, b, result;

а = 127;

b = 127;

result = (byte)(a * b);

Здесь произведение значений а и b превышает диапазон представления значений типа byte. Следовательно, результат вычисления этого выражения вызвал переполнение для типа переменной result .

С# позволяет управлять генерированием исключений при возникновении переполнения с помощью ключевых слов checked и unchecked. Чтобы указать, что некоторое выражение должно быть проконтролировано на предмет переполнения, используйте ключевое слово checked. А чтобы проигнорировать переполнение, используйте ключевое слово unchecked. В последнем случае результат будет усечен так, чтобы его тип соответствовал типу-результату выражения.

Ключевое слово checked имеет две формы. Одна проверяет конкретное выражение и называется операторной checked-формой. Другая же проверяет блок инструкций.

checked (expr)

checked {

// Инструкции, подлежащие проверке.

}

Здесь expr — выражение, которое необходимо контролировать. Если значение контролируемого выражения переполнилось, генерируется исключение типа OverflowException.

Ключевое слово unchecked имеет две формы. Одна из них — операторная форма, которая позволяет игнорировать переполнение для заданного выражения. Вторая игнорирует переполнение, которое возможно в блоке инструкций.

unchecked (expr)

unchecked {

// Инструкции, для которых переполнение игнорируется.

}

Здесь ехрr — выражение, которое не проверяется на предмет переполнения. В случае переполнения это выражение усекается.

Рассмотрим программу, которая демонстрирует использование как слова checked, так и слова unchecked.

// Использование ключевых слов checked и unchecked.

usingSystem;

classCheckedDemo {

publicstaticvoidMain() {

bytea, b;

byte result;

a = 127;

b = 127;

try {

result = unchecked((byte)(a * b));

Console.WriteLine("Unchecked-результат: " + result);

result = checked((byte)(a * b)); // Эта инструкция

// вызывает исключение.

Console.WriteLine("Checked-результат: " +

result); // Инструкция не будет

// выполнена.

}

catch (OverflowExceptionexc) {

// Перехватываемисключение.

Console.WriteLine(exc);

}}}

При выполнении этой программы получаются такие результаты:

Unchecked-результат: 1

System.OverflowException: Arithmetic operation resulted in an

overflow.

atCheckedDemo.Main()

Результат непроверяемого выражения усекается. В случае разрешения проверки переполнения было бы сгенерировано исключение.

В предыдущей программе было продемонстрировано использование ключевых слов checked и unchecked для одного выражения. На примере следующей программы показано, как можно избежать переполнения при выполнении блока инструкций.

// для блоков инструкций.

usingSystem;

class CheckedBlocks {

public static void Main() {

byte a, b;

byte result;

а = 127;

b = 127;

try {

unchecked {

a = 127;

b =127;

result = unchecked((byte)(a * b));

Console.WriteLine("Unchecked-результат: " + result);

a =125;

b = 5;

result = unchecked((byte)(a * b));

Console.WriteLine("Unchecked-результат: " + result);

}

checked {

a = 2;

b = 7;

result = checked((byte)(a * b)); // Всевпорядке.

Console.WriteLine("Checked-результат: " + result);

a = 127;

b = 127;

result = checked((byte)(a * b)); // Здесьдолжно

// бытьсгенерировано

// исключение.

Console.WriteLine("Checked-результат: " +

result); // Этаинструкцияне

// выполнится.

}}

catch (OverflowExceptionexc) {

// Перехватываемисключение.

Console .WriteLine (exc);

}}}

Вот как выглядят результаты выполнения этой программы:

Unchecked-результат: 1

Unchecked-результат: 113

Checked-результат: 14

System.OverflowException: Arithmetic operation resulted in an overflow,

at CheckedBlocks.Main()

Как видите, при выполнении unchecked