Страница 198 из 502
<b>checked {</b>
<b>// проверяемые операторы</b>
<b>}</b>
где выражение обозначает проверяемое выражение. Если вычисление проверяемого выражения приводит к переполнению, то генерируется исключение OverflowException.
У ключевого слова unchecked также имеются две общие формы. В первой, операторной форме переполнение игнорируется при вычислении конкретного выражения. А во второй, блочной форме оно игнорируется при выполнении блока операторов:
<b>unchecked (<i>выражение)</i> </b>
<b>unchecked {</b>
<b>// операторы, для которых переполнение игнорируется</b>
<b>}</b>
где выражение обозначает конкретное выражение, при вычислении которого переполнение игнорируется. Если же в непроверяемом выражении происходит переполнение, то результат его вычисления усекается.
Ниже приведен пример программы, в котором демонстрируется применение ключевых слов checked и unchecked.
<b>// Продемонстрировать применение ключевых слов checked и unchecked.</b>
<b>using System;</b>
<b>class CheckedDemo {</b>
<b> static void Main() {</b>
<b> byte a, b;</b>
<b> byte result;</b>
<b> a = 127;</b>
<b> b = 127;</b>
<b> try {</b>
<b> result = unchecked((byte) (a * b));</b>
<b> Console.WriteLine("Непроверенный на переполнение результат: " + result);</b>
<b> result = checked((byte)(a * b)); // эта операция приводит к</b>
<b> // исключительной ситуации </b>
<b> Console.WriteLine("Проверенный на переполнение результат: " + result);</b>
<b> //не подлежит выполнению</b>
<b> }</b>
<b> catch (OverflowException exc) {</b>
<b> Console.WriteLine(exc);</b>
<b> }</b>
<b> }</b>
<b>}</b>
При выполнении этой программы получается следующий результат.
<b>Непроверенный на переполнение результат: 1</b>
<b> System.OverflowException: Переполнение в результате выполнения арифметической операции.</b>
<b>в CheckedDemo.Main() в <i><имя_файла</i>>:строка 20</b>
Как видите, результат вычисления непроверяемого выражения был усечен. А вычисление проверяемого выражения привело к исключительной ситуации.
В представленном выше примере программы было продемонстрировано применение ключевых слов checked и unchecked в одном выражении. А в следующем примере программы показывается, каким образом проверяется и не проверяется на переполнение целый блок операторов.
<b>// Продемонстрировать применение ключевых слов checked </b>
<b>// и unchecked в блоке операторов.</b>
<b>using System;</b>
<b>class CheckedBlocks {</b>
<b> static void Main() {</b>
<b> byte a, b;</b>
<b> byte result;</b>
<b> a = 127;</b>
<b> b = 127;</b>
<b> try {</b>
<b> unchecked {</b>
<b> a = 127;</b>
<b> b = 127;</b>
<b> result = unchecked((byte)(a * b));</b>
<b> Console.WriteLine("Непроверенный на переполнение результат: " + result);</b>
<b> a = 125;</b>
<b> b = 5;</b>
<b> result = unchecked((byte)(a * b));</b>
<b> Console.WriteLine("Непроверенный на переполнение результат: " + result);</b>
<b> }</b>
<b> checked {</b>
<b> a = 2;</b>
<b> b = 7;</b>
<b> result = checked((byte)(a * b)); // верно</b>
<b> Console.WriteLine("Проверенный на переполнение результат: " + result);</b>
<b> a = 127;</b>
<b> b = 127;</b>
<b> result = checked((byte)(a * b)); // эта операция приводит к</b>
<b> // исключительной ситуации </b>
<b> Console.WriteLine("Проверенный на переполнение результат: " + result);</b>
<b> //не подлежит выполнению</b>