1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 13
Текст из файла (страница 13)
Элементыширина и формат указывать необязательно. Следовательно, спецификатор формата {0}означает arg0, {1} означает arg1 и т.д.Теперь рассмотрим простой пример. При выполнении инструкции62Часть I. Язык C#Console.WriteLine("В феврале {0} или {1} дней.", 28, 29);будет сгенерирован следующий результат:В феврале 28 или 29 дней.Как видите, вместо спецификатора {0} было подставлено значение 28, а вместоспецификатора {1} — значение 29. Таким образом, внутри строки форматированияспецификаторы формата идентифицируют местоположение последовательно заданныхаргументов (в данном случае это числа 28 и 29).
Обратите также внимание на то, чтосоставные части выводимого результата разделены не знаками “+”, а запятыми.А теперь “сыграем” вариацию на тему предыдущей инструкции, указав вспецификаторах формата минимальную ширину поля.Console.WriteLine("В феврале {0,10} или {1,5} дней.", 28, 29);Вот как будет выглядеть результат ее выполнения:В феврале 28 или 29 дней.Нетрудно убедиться, что при выводе значений аргументов были добавлены пробелы,заполняющие неиспользуемые части полей. Обратите внимание на то, что второй элементспецификатора формата означает минимальную ширину поля.
Другими словами, принеобходимости это значение может быть превышено.Безусловно, аргументы, связанные с командой форматирования, необязательнодолжны быть константами. Например, в следующей программе отображается таблицарезультатов возведения ряда чисел в квадрат и куб.// Использование команд форматирования.using System;class DisplayOptions {public 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);Вот как выглядит результат выполнения этой программы:Число Квадрат Куб111248392741664525125636216749343864512981729В предыдущих примерах программ выводимые значения не форматировались.Конечно же, спецификаторы формата позволяют управлять характером их отображения.Обычно форматируются десятичные значения и значения с плавающей точкой.
Самыйпростой способ задать формат — описать шаблон, которым будет пользоваться методWriteLine(). Для этого рассмотрим пример форматирования с помощью символов “#”,отмечающих позиции цифр. При этом можно указать расположение десятичнойГлава 3. Типы данных, литералы и переменные63точки и запятых, которые используются в качестве разделителей групп разрядов. Выше мыприводили пример отображения частного от деления числа 10 на 3. Теперь рассмотрим ещеодин вариант вывода результата выполнения этой арифметической операции.Console.WriteLine("При делении 10/3 получаем: {0:#.##}", 10.0/3.0);Теперь результат выглядит по-другому:При делении 10/3 получаем: 3.33В этом примере шаблон имеет вид #.##, что для метода WriteLine() служитуказанием отобразить лишь два десятичных разряда.
Но важно понимать, что принеобходимости слева от десятичной точки будет отображено столько цифр, сколькопотребуется, чтобы не исказить значение.А вот еще пример. При выполнении инструкцииConsole.WriteLine("{0:###,###.##}", 123456.56);будет сгенерирован следующий результат:123,456.56Если нужно отобразить значение в формате представления долларов и центов,используйте спецификатор формата С.
Вот пример:decimal balance;balance = 12323.09m;Console.WriteLine("Текущий баланс равен {0:C}, balance);Результат выполнения этой последовательности инструкций выглядит так:Текущий баланс равен $12,323.09Формат с можно использовать для улучшения представления результата выполненияпрограммы вычисления цены со скидкой, которая рассматривалась выше./*Использование спецификатора формата C для выводазначений в виде долларов и центов.*/using System;class UseDecimal {public static void Main() {decimal price;decimal discount;decimal discounted_price;// Вычисляем цену со скидкой.price = 19.95m;discount = 0.15m; // Ставка дисконта равна 15%.}}discounted_price = price - (price * discount);Console.WriteLine("Цена со скидкой: {0:C}",discounted_price);Посмотрите, как теперь выглядит результат выполнения программы, и сравните его спредыдущим:Цена со скидкой: 16,96р.64Часть I.
Язык C#ЛитералыВ C# литералами называются фиксированные значения, представленные в понятнойформе. Например, число 100 — это литерал. Литералы также называют константами. Побольшей части применение литералов происходит на интуитивном уровне, и поэтому мыбез особых пояснений использовали их в той или иной форме во всех предыдущихпримерах программ. Теперь настало время объяснить их формально.C#-литералы могут иметь любой тип значений.
Способ их представления зависит отих типа. Как упоминалось выше, символьные константы заключаются между двумяодинарными кавычками. Например, как ‘а’, так и ‘%’ — символьные константы.Целочисленные литералы задаются как числа без дробной части.
Например, 10 и 100 — это целочисленные константы. Константы с плавающей точкой должны обязательноиметь десятичную точку, а за ней — дробную часть числа. Примером константы сплавающей точкой может служить число 11.123. Для вещественных чисел C# позволяеттакже использовать экспоненциальное представление (в виде мантиссы и порядка).Поскольку C# — строго типизированный язык, литералы в нем также имеют тип.Отсюда сразу возникает вопрос: как определить тип литерала? Например, какой тип имеюттакие литералы, как 12, 123987 или 0.23? К счастью, C# определяет несколько простыхправил, позволяющих ответить на эти вопросы.Во-первых, что касается целочисленных литералов, то им присваивается наименьшийцелочисленный тип, который сможет его хранить, начиная с типа int. Таким образом,целочисленный литерал, в зависимости от конкретного значения, может иметь тип int,uint, long или ulong.
Во-вторых, все литералы с плавающей точкой имеют тип double.Если тип, задаваемый по умолчанию в языке C#, не соответствует вашим намерениямв отношении типа конкретного литерала, вы можете явно определить его с помощьюнужного суффикса. Чтобы задать литерал типа long, присоедините к его концу букву lили L. Например, если значение 12 автоматически приобретает тип int, но значение 12Lимеет тип long.
Чтобы определить целочисленное значение без знака, используйтесуффикс u или U. Так, если значение 100 имеет тип int, но значение 100U — тип uint.Для задания длинного целого без знака используйте суффикс ul или UL (например,значение 987654UL будет иметь тип ulong).Чтобы задать литерал типа float, используйте суффикс f или F (например,10.19F).Чтобы задать литерал типа decimal, используйте суффикс m или М (например, 9.95М).Несмотря на то что целочисленные литералы создают int-, uint-, long- илиulong-значения по умолчанию, их тем не менее можно присваивать переменным типаbyte, sbyte, short или ushort, если, конечно, они могут быть представленысоответствующим типом.Шестнадцатеричные литералыВероятно, вам известно, что в программировании вместо десятичной иногда удобнееиспользоватьсистемусчисленияпооснованию16,котораяназываетсяшестнадцатеричной. В ней используются цифры от 0 до 9 и буквы от А до F, которыеслужат для обозначения шестнадцатеричных “цифр” 10, 11, 12, 13, 14 и 15.
Например,число 10 в шестнадцатеричной системе равно десятичному числу 16. Язык C#, как и многиедругие языки программирования, позволяет задавать целочисленные константы вшестнадцатеричном формате. Шестнадцатеричный литерал должен начинаться с парысимволов 0x (нуля и буквы “x”). Приведем несколько примеров.count = 0xFF; // 255 в десятичной системеГлава 3. Типы данных, литералы и переменные65incr = 0x1a; // 26 в десятичной системеУправляющие последовательности символовСреди множества символьных констант, образующихся в результате заключениясимволов в одинарные кавычки, помимо печатных символов есть такие (например, символвозврата каретки), которые создают проблему при использовании текстовых редакторов.Некоторые символы, например одинарная или двойная кавычка, имеют в C# специальноезначение, поэтому их нельзя использовать непосредственно.
По этим причинам в C#предусмотрено несколько управляющих последовательностей символов (ESCпоследовательностей), перечисленных в табл. 3.3. Эти последовательности используютсявместо символов, которых они представляют.Например, следующая инструкция присваивает переменной ch символ табуляции:ch = ‘\t’;А эта инструкция присваивает переменной ch символ одинарной кавычки:ch = ‘\’’;Таблица 3.3.
Управляющие последовательности символовESC-последовательностьОписание\а\b\f\n\r\t\v\0\’\"\\Звуковой сигнал (звонок)Возврат на одну позициюПодача страницы (для перехода к началу следующей страницы)Новая строкаВозврат кареткиГоризонтальная табуляцияВертикальная табуляцияНуль-символОдинарная кавычка (апостроф)Двойная кавычкаОбратная косая чертаСтроковые литералыЯзык C# поддерживает еще один тип литерала: строковый. Строка — это наборсимволов, заключенных в двойные кавычки.
Например, фрагмент кода"Это тест"представляет собой строку. В предыдущих фрагментах программ (а именно в инструкцияхвызова метода WriteLine()) вы видели другие примеры строк.Помимо обычных символов, строковый литерал может содержать одну или несколькоуправляющих последовательностей. Рассмотрим, например, следующую программу. В нейиспользуются такие ESC-последовательности, как \n, \t и \".// Использование ESC-последовательностей в строках.using System;66Часть I.
Язык C#class StrDemo {public static void Main() {Console.WriteLine("Первая строка\nВторая строка\nТретья строка");Console.WriteLine("Один\tДва\tТри");Console.WriteLine("Четыре\tПять\tШесть");// Вставляем кавычки.Console.WriteLine("\"Зачем?\", спросил он.");}}Вот что получаем в результате:Первая строкаВторая строкаТретья строкаОдинДваТриЧетыреПятьШесть"Зачем?", спросил он.Обратите внимание на то, как управляющая последовательность \n используется дляперехода на новую строку, благодаря чему не нужно многократно вызывать методWriteLine() для организации выводимых данных на нескольких строках. В те позиции,где необходимо сделать переход на новую строку, достаточно вставить ESCпоследовательность \n.