Выбрать главу

В C# символы представлены не 8-разрядным кодом, как во многих других языках программирования, например C++, а 16-разрядным кодом, который называется унико дом (Unicode). В уникоде набор символов представлен настолько широко, что он охва тывает символы практически из всех естественных языков на свете. Если для многих естественных языков, в том числе английского, французского и немецкого, характерны относительно небольшие алфавиты, то в ряде других языков, например китайском, употребляются довольно обширные наборы символов, которые нельзя представить 8-разрядным кодом. Для преодоления этого ограничения в C# определен тип char, представляющий 16-разрядные значения без знака в пределах от 0 до 65 535. При этом стандартный набор символов в 8-разрядном коде ASCII является подмножеством уни кода в пределах от 0 до 127. Следовательно, символы в коде ASCII по-прежнему оста ются действительными в С#.

Для того чтобы присвоить значение символьной переменной, достаточно заклю чить это значение (т.е. символ) в одинарные кавычки. Так, в приведенном ниже фраг менте кода переменной ch присваивается символ X. char ch; ch = 'X';

Значение типа char можно вывести на экран с помощью метода WriteLine(). Например, в следующей строке кода на экран выводится значение переменной ch. Console.WriteLine("Значение ch равно: " + ch);

Несмотря на то что тип char определен в C# как целочисленный, его не следует путать со всеми остальными целочисленными типами. Дело в том, что в C# отсутству ет автоматическое преобразование символьных значений в целочисленные и обратно.

Например, следующий фрагмент кода содержит ошибку. char ch; ch = 88; // ошибка, не выйдет

Ошибочность приведенного выше фрагмента кода объясняется тем, что 88 — это целое значение, которое не преобразуется автоматически в символьное. При попытке скомпилировать данный фрагмент кода будет выдано соответствующее сообщение об ошибке. Для того чтобы операция присваивания целого значения символьной пере менной оказалась допустимой, необходимо осуществить приведение типа, о котором речь пойдет далее в этой главе. Логический тип данных

Тип bool представляет два логических значения: "истина" и "ложь". Эти логиче ские значения обозначаются в C# зарезервированными словами true и false соот ветственно. Следовательно, переменная или выражение типа bool будет принимать одно из этих логических значений. Кроме того, в C# не определено взаимное преобра зование логических и целых значений. Например, 1 не преобразуется в значение true, а 0 — в значение false.

В приведенном ниже примере программы демонстрируется применение типа bool. // Продемонстрировать применение типа bool. using System; class BoolDemo { static void Main() { bool b; b = false; Console.WriteLine("b равно " + b); b = true; Console.WriteLine("b равно " + b); // Логическое значение может управлять оператором if. if(b) Console.WriteLine("Выполняется."); b = false; if (b) Console.WriteLine("He выполняется."); // Результатом выполнения оператора отношения // является логическое значение. Console.WriteLine("10 > 9 равно " + (10 > 9)); } }

Эта программа дает следующий результат. b равно False b равно True Выполняется. 10 > 9 равно True

В приведенной выше программе обнаруживаются три интересные особенно сти. Во-первых, при выводе логического значения типа bool с помощью метода WriteLine() на экране появляется значение "True" или "False". Во-вторых, самого значения переменной типа bool достаточно для управления оператором if. Для это го не нужно, например, записывать оператор if следующим образом. if(b == true) ...

И в-третьих, результатом выполнения оператора отношения является логическое значение. Именно поэтому в результате вычисления выражения 10 > 9 на экран вы водится значение "True." Кроме того, выражение 10 > 9 следует заключить в скобки, поскольку оператор + имеет более высокий приоритет, чем оператор >. Некоторые возможности вывода

До сих пор при выводе с помощью метода WriteLine() данные отображались в формате, используемом по умолчанию. Но в среде .NET Framework определен до статочно развитый механизм форматирования, позволяющий во всех деталях управ лять выводом данных. Форматированный ввод-вывод подробнее рассматривается далее в этой книге, а до тех пор полезно ознакомиться с некоторыми возможностями форма тирования. Они позволяют указать, в каком именно виде следует выводить значения с помощью метода WriteLine(). Благодаря этому выводимый результат выглядит более привлекательно. Следует, однако, иметь в виду, что механизм форматирования поддерживает намного больше возможностей, а не только те, которые рассматривают ся в этом разделе.

При выводе списков данных в предыдущих примерах программ каждый элемент списка приходилось отделять знаком +, как в следующей строке. Console.WriteLine("Вы заказали " + 2 + " предмета по цене $" + 3 + " каждый.");

Конечно, такой способ вывода числовой информации удобен, но он не позволяет управлять внешним видом выводимой информации. Например, при выводе значения с плавающей точкой нельзя определить количество отображаемых десятичных раз рядов. Рассмотрим оператор Console.WriteLine("Деление 10/3 дает: " + 10.0/3.0);

который выводит следующий результат. Деление 10/3 дает: 3.33333333333333

В одних случаях такого вывода может оказаться достаточно, а в других — он про сто недопустим. Например, в финансовых расчетах после десятичной точки принято указывать лишь два десятичных разряда.

Для управления форматированием числовых данных служит другая форма метода WriteLine(), позволяющая встраивать информацию форматирования, как показано ниже. WriteLine("форматирующая строка", arg0, arg1, ... , argN);

В этой форме аргументы метода WriteLine() разделяются запятой, а не знаком +. А форматирующая строка состоит из двух элементов: обычных печатаемых символов, предназначенных для вывода в исходном виде, а также спецификаторов формата. По следние указываются в следующей общей форме: {argnum, width: fmt}

где argnum — номер выводимого аргумента, начиная с нуля; width — минимальная ширина поля; fmt — формат. Параметры width и fmt являются необязательными. Если во время выполнения в форматирующей строке встречается спецификатор формата, то вместо него подставляется и отображается соответствующий аргумент, обозначаемый параметром argnum. Таким образом, местоположение спецификатора формата в форматирующей строке определяет место отображения соответствующих данных. Параметры width и fmt указывать необязательно. Это означает, что в своей простейшей форме спецификатор формата обозначает конкретный отображаемый аргумент. Например, спецификатор {0} обозначает аргумент arg0, спецификатор {1} — аргумент arg1 и т.д.

Начнем с самого простого примера. При выполнение оператора Console.WriteLine("В феврале {0} или {1} дней.", 28, 29);

получается следующий результат. В феврале 28 или 29 дней

Как видите, значение 28 подставляется вместо спецификатора {0}, а значение 29 — вместо спецификатора {1}. Следовательно, спецификаторы формата обозначают ме сто в строке, где отображаются соответствующие аргументы (в данном случае — зна чения 28 и 29). Кроме того, обратите внимание на то, что дополнительные значения разделяются запятой, а не знаком +.

Ниже приведен видоизмененный вариант предыдущего оператора, в котором ука зывается ширина полей. Console.WriteLine("В феврале {0,10} или {1,5} дней.", 28, 29);

Выполнение этого оператора дает следующий результат. В феврале 28 или 29 дней.

Как видите, неиспользуемые части полей заполнены пробелами. Напомним, что минимальная ширина поля определяется параметром width. Если требуется, она мо жет быть превышена при выводе результата.

Разумеется, аргументы, связанные с командой форматирования, не обязательно должны быть константами. Ниже приведен пример программы, которая выводит та блицу результатов возведения чисел в квадрат и куб. В ней команды форматирования используются для вывода соответствующих значений. // Применить команды форматирования. using System; class DisplayOptions { static void Main() { int i; Console.WriteLine("Число\tКвадрат\tКуб"); for(i = 1; i < 10; i++) Console.WriteLine("{0}\t{1}\t{2}", i, i*i, i*i*i); } }

Результат выполнения этой программы выглядит следующим образом. Число Квадрат Куб 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729

В приведенных выше примерах сами выводимые значения не форматировались. Но ведь основное назначение спецификаторов формата — управлять внешним видом выводимых данных. Чаще всего форматированию подлежат следующие типы данных: с плавающей точкой и десятичный. Самый простой способ указать формат данных — описать шаблон, который будет использоваться в методе WriteLine(). Для этого ука зывается образец требуемого формата с помощью символов #, обозначающих разряды чисел. Кроме того, можно указать десятичную точку и запятые, разделяющие цифры. Ниже приведен пример более подходящего вывода результата деления 10 на 3. Console.WriteLine("Деление 10/3 дает: (0:#.##)", 10.0/3.0);

Выполнение этого оператора приводит к следующему результату. Деление 10/3 дает: 3.33

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

Рассмотрим еще один пример. Оператор Console.WriteLine("{0:###,###.##}", 123456.56);

дает следующий результат. 123,456.56