Ответы по Технологии программирования / Использование ключевых слов checked и unchecked
.docxВ С# предусмотрено специальное средство, которое связано с генерированием исключений, связанных с переполнением в арифметических вычислениях. Как вы знаете, в некоторых случаях при вычислении арифметических выражений получается результат, который выходит за пределы диапазона, определенного для типа данных в выражении. В этом случае говорят, что произошло переполнение результата. Рассмотрим, например, такой фрагмент программы:
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