Добавить в цитаты Настройки чтения

Страница 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(&quot;Непроверенный на переполнение результат: &quot; + result);</b>

<b>      result = checked((byte)(a * b)); // эта операция приводит к</b>

<b>                   // исключительной ситуации </b>

<b>      Console.WriteLine(&quot;Проверенный на переполнение результат: &quot; + 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>&lt;имя_файла</i>&gt;:строка 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(&quot;Непроверенный на переполнение результат: &quot; + result);</b>

<b>        a = 125;</b>

<b>        b = 5;</b>

<b>        result = unchecked((byte)(a * b));</b>

<b>        Console.WriteLine(&quot;Непроверенный на переполнение результат: &quot; + 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(&quot;Проверенный на переполнение результат: &quot; + result);</b>

<b>        a = 127;</b>

<b>        b = 127;</b>

<b>        result = checked((byte)(a * b)); // эта операция приводит к</b>

<b>                  // исключительной ситуации </b>

<b>        Console.WriteLine(&quot;Проверенный на переполнение результат: &quot; + result);</b>

<b>               //не подлежит выполнению</b>