Шрифт:
byte a, b, result; а = 127; b = 127; result = (byte)(а * b); В этом коде произведение значений переменных а и b превышает диапазон пред ставления чисел для типа byte. Следовательно, результат вычисления данного вы ражения приводит к переполнению для типа данных, сохраняемого в переменной result. В C# допускается указывать, будет ли в коде сгенерировано исключение при пере полнении, с помощью ключевых слов checked и unchecked. Так, если требуется ука зать, что выражение будет проверяться на переполнение, следует использовать клю чевое слово checked, а если требуется проигнорировать переполнение — ключевое слово unchecked. В последнем случае результат усекается, чтобы не выйти за пределы диапазона представления чисел для целевого типа выражения. У ключевого слова checked имеются две общие формы. В одной форме проверя ется конкретное выражение, и поэтому она называется операторной. А в другой форме проверяется блок операторов, и поэтому она называется блочной. Ниже приведены обе формы:
checked (выражение)
checked { // проверяемые операторы } где выражение обозначает проверяемое выражение. Если вычисление прове ряемого выражения приводит к переполнению, то генерируется исключение OverflowException. У ключевого слова unchecked также имеются две общие формы. В первой, опера торной форме переполнение игнорируется при вычислении конкретного выражения. А во второй, блочной форме оно игнорируется при выполнении блока операторов:
unchecked (выражение)
unchecked { // операторы, для которых переполнение игнорируется } где выражение обозначает конкретное выражение, при вычислении которого перепол нение игнорируется. Если же в непроверяемом выражении происходит переполнение, то результат его вычисления усекается. Ниже приведен пример программы, в котором демонстрируется применение клю чевых слов checked и unchecked.
// Продемонстрировать применение ключевых слов checked и unchecked. using System;
class CheckedDemo { static void Main { byte a, b; byte result; a = 127; b = 127; try { result = unchecked((byte)(a b)); Console.WriteLine("Непроверенный на переполнение результат: " + result); 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); а = 125; b = 5; result = unchecked((byte)(a * b)); Console.WriteLine("Непроверенный на переполнение результат: " + result); } checked { a = 2; b = 7; result = checked((byte)(a * b)); // верно Console.WriteLine("Проверенный на переполнение результат: " + result); а = 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 может воз никнуть, в частности, потому, что по умолчанию проверяемое или непроверяемое со стояние переполнения определяется путем установки соответствующего параметра компилятора и настройки самой среды выполнения. Поэтому в некоторых програм мах состояние переполнения лучше проверять явным образом.
ГЛАВА 14. Применение средств ввода-вывода
В примерах программ, приводившихся в предыду щих главах, уже применялись отдельные части си стемы ввода-вывода в С#, например метод Console. WriteLine, но делалось это без каких-либо формальных пояснений. Система ввода-вывода основана в C# на иерар хии классов, поэтому ее функции и особенности нельзя было представлять до тех пор, пока не были рассмотрены классы, наследование и исключения. А теперь настал черед и для ввода-вывода. В C# применяется система ввода-вывода и классы, определенные в среде .NET Framework, и поэтому рассмотрение ввода-вывода в этом языке относится ко всей системе ввода-вывода среды .NET в целом.
В этой главе речь пойдет о средствах консольного и фай лового ввода-вывода. Следует, однако, сразу же предупре дить, что система ввода-вывода в C# довольно обширна. По этому в этой главе рассматриваются лишь самые важные и наиболее часто используемые ее средства. Организация системы ввода-вывода в C# на потоках
Ввод-вывод в программах на C# осуществляется посред ством потоков. Поток — это некая абстракция производ ства или потребления информации. С физическим устрой ством поток связывает система ввода-вывода. Все потоки действуют одинаково — даже если они связаны с разными физическими устройствами. Поэтому классы и методы ввода-вывода могут применяться к самым разным типам устройств. Например, методами вывода на консоль можно пользоваться и для вывода в файл на диске. Байтовые и символьные потоки