Overflow.
Unchecked (expr)
Checked (expr)
checked {
// Инструкции, подлежащие проверке.
}
Здесь expr — выражение, которое необходимо контролировать. Если значение контролируемого выражения переполнилось, генерируется исключение типа OverflowException.
Ключевое слово unchecked имеет две формы. Одна из них — операторная форма, которая позволяет игнорировать переполнение для заданного выражения. Вторая игнорирует переполнение, которое возможно в блоке инструкций.
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
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