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