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

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

      Console.WriteLine("Проверенный на переполнение результат: " + result);

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

    }

    catch (OverflowException exc) {

      Console.WriteLine(exc);

    }

  }

}

При выполнении этой программы получается следующий результат.

Непроверенный на переполнение результат: 1

 System.OverflowException: Переполнение в результате выполнения арифметической операции.

в CheckedDemo.Main() в <имя_файла>:строка 20

Как видите, результат вычисления непроверяемого выражения был усечен. А вычисление проверяемого выражения привело к исключительной ситуации.

В представленном выше примере программы было продемонстрировано применение ключевых слов checked и unchecked в одном выражении. А в следующем примере программы показывается, каким образом проверяется и не проверяется на переполнение целый блок операторов.

// Продемонстрировать применение ключевых слов checked

// и unchecked в блоке операторов.

using System;

class CheckedBlocks {

  static void Main() {

    byte a, b;

    byte result;

    a = 127;

    b = 127;

    try {

      unchecked {

        a = 127;

        b = 127;

        result = unchecked((byte)(a * b));

        Console.WriteLine("Непроверенный на переполнение результат: " + result);

        a = 125;

        b = 5;

        result = unchecked((byte)(a * b));

        Console.WriteLine("Непроверенный на переполнение результат: " + result);

      }

      checked {

        a = 2;

        b = 7;

        result = checked((byte)(a * b)); // верно

        Console.WriteLine("Проверенный на переполнение результат: " + result);

        a = 127;

        b = 127;

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

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

        Console.WriteLine("Проверенный на переполнение результат: " + result);

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

      }

    }

    catch (OverflowException exc) {

      Console.WriteLine(exc);

    }

  }

}

Результат выполнения этой программы приведен ниже.

Непроверенный на переполнение результат: 1

Непроверенный на переполнение результат: 113

Проверенный на переполнение результат: 14

System.OverflowException: Переполнение в результате выполнения арифметической операции.

в CheckedDemo.Main() в <имя_файла>:строка 41

Как видите, результаты выполнения непроверяемого на переполнение блока операторов были усечены. Когда же в проверяемом блоке операторов произошло переполнение, то возникла исключительная ситуация.

Потребность в применении ключевого слова checked или unchecked может возникнуть, в частности, потому, что по умолчанию проверяемое или непроверяемое состояние переполнения определяется путем установки соответствующего параметра компилятора и настройки самой среды выполнения. Поэтому в некоторых программах состояние переполнения лучше проверять явным образом.

<p><strong>ГЛАВА 14 Применение средств ввода-вывода</strong></p>

В примерах программ, приводившихся в предыдущих главах, уже применялись отдельные части системы ввода-вывода в С#, например метод Console.WriteLine(), но делалось это без каких-либо формальных пояснений. Система ввода-вывода основана в C# на иерархии классов, поэтому ее функции и особенности нельзя было представлять до тех пор, пока не были рассмотрены классы, наследование и исключения. А теперь настал черед и для ввода-вывода. В C# применяется система ввода-вывода и классы, определенные в среде .NET Framework, и поэтому рассмотрение ввода-вывода в этом языке относится ко всей системе ввода-вывода среды .NET в целом.

Перейти на страницу:

Похожие книги