
- •Лекция 8. Ввод и вывод данных в с#
- •Потоки: байтовые, символьные, двоичные
- •Общая характеристика классов потоков
- •Предопределенные потоки ввода/вывода
- •Функция ToString()
- •Консольный ввод/вывод. Функции – члены класса Console
- •Консольный вывод. Форматирование
- •Нестандартное (custom) форматирование значений
- •Консольный ввод. Преобразование значений
Консольный ввод/вывод. Функции – члены класса Console
При обсуждении процедур ввода/вывода следует иметь в виду одно важное обстоятельство. Независимо от типа выводимого значения, в конечном результате выводится СИМВОЛЬНОЕ ПРЕДСТАВЛЕНИЕ значения. Это становится очевидным при выводе информации в окно приложения, что и обеспечивают по умолчанию методы Console.Write и Console.WriteLine.
WriteLine отличается тем, что завершает свою работу обязательным выводом Escape-последовательности line feed/carriage return.
Console.WriteLine("The Captain is on the board!"); // Вывод строки.
Console.WriteLine(314); //Символьное представление целочисленного значения.
Console.WriteLine(3.14); //Символьное представление значения типа float.
Выводимая символьная строка может содержать Escape-последовательности, которые при выводе информации в окно представления позволяют создавать различные "специальные эффекты".
Методы с одним параметром достаточно просты. Практически все происходит само собой. Уже на стадии компиляции при выяснении типа выводимого значения подбирается соответствующий вариант перегруженной функции вывода.
При выводе значения определяется его тип, производится соответствующее стандартное преобразование к символьному виду, которое в виде последовательности символов, соответствующей существующей в операционной системе настройке языковых параметров, представления чисел, времени и дат, и выводится в окно представления.
Для облегчения процесса программирования ввода/вывода в C# также используются варианты функций Write и WriteLine с несколькими параметрами.
Эти методы называются ПЕРЕГРУЖАЕМЫМИ (см. о перегрузке методов). Для программиста C# это означает возможность вызова этих функций с различными параметрами. Можно предположить, что различным вариантам списков параметров функции могут соответствовать различные варианты функций вывода.
Ниже представлен вариант метода WriteLine с тремя параметрами. Во всех случаях, когда количество параметров превышает 1, первый параметр обязан быть символьной строкой:
Console.WriteLine("qwerty",314,3.14);
Чтобы понять, как выполняется такой оператор, следует иметь в виду, что всякий параметр метода является выражением определенного типа, которое в процессе выполнения метода может вычисляться для определения значения соответствующего выражения. Таким образом, при выполнении метода WriteLine должны быть определены значения его параметров, после чего в окне приложения должна появиться определенная последовательность символов. Ниже представлен результат выполнения выражения вызова функции:
qwerty
Значения второго и третьего параметров не выводятся.
Дело в том, что первый строковый параметр выражений вызова функций Write и WriteLine используется как управляющий шаблон для представления выводимой информации. Значения следующих за строковым параметром выражений будут выводиться в окно представления лишь в том случае, если первый параметр-строка будет явно указывать места расположения выводимых значений, соответствующих этим параметрам. Явное указание обеспечивается маркерами выводимых значений, которые в самом простом случае представляют собой заключенные в фигурные скобки целочисленные литералы (например, {3}).
При этом способ указания места состоит в следующем:
CLR индексирует все параметры метода WriteLine, идущие за первым параметром-строкой. При этом второй по порядку параметр получает индекс 0, следующий за ним будет 1, и т. д. до конца списка параметров;
в произвольных местах параметра-шаблона размещаются маркеры выводимых значений;
значение маркера должно соответствовать индексу параметра, значение которого нужно вывести на экран;
значение целочисленного литерала маркера не должно превышать максимального значения индекса параметра.
Таким образом, оператор
Console.WriteLine("The sum of {0} and {1} is {2}",314,3.14,314+3.14);
обеспечивает вывод следующей строки:
The sum of 314 and 3.14 is 317.14
В последнем операнде выражения вызова WriteLine при вычислении значения выражения используется неявное приведение типа. При вычислении значения суммы операнд типа int без потери значения приводится к типу float. Безопасные преобразования типов проводятся автоматически.
Несмотря на явную абсурдность выводимых утверждений, операторы
Console.WriteLine("The sum of {0} and {1} is {0}",314,3.14,314+3.14);
Console.WriteLine("The sum of {2} and {1} is {0}",314,3.14,314+3.14);
также отработают вполне корректно.