Российский Государственный Технологический Университет им. К.Э. Циолковского
Опубликован: 02.03.2007 | Доступ: свободный | Студентов: 5636 / 790 | Оценка: 3.96 / 3.45 | Длительность: 27:04:00
ISBN: 978-5-9556-0086-4
Лекция 11:

Ввод/вывод

Функция ToString()

C# является языком, строго и в полном объеме реализующим принципы ООП. В этом языке все построено на классах и нет ничего, что бы не соответствовало принципам объектно-ориентированного программирования. Любой элементарный тип является наследником общего класса Object, реализующего, в частности, метод String ToString(), формирующий в виде human-readable текстовой строки описание тех или иных характеристик типа и значений объектов – представителей данного типа. Любой тип – наследник класса Object (а это ВСЕ типы!) имеет либо унаследованную, либо собственную переопределенную версию метода ToString(). Применительно к объектам предопределенного типа из CTS, соответствующие версии методов ToString() обеспечивают преобразование значения данного типа к строковому виду.

Все сделано для программиста. Реализация метода преобразования значения в строку в конечном счете оказывается скрытой от программиста. Именно поэтому вывод значений предопределенных типов с использованием функций Write и WriteLine в программах на языке C# осуществляется так легко и просто. В справочнике по поводу этих функций так и сказано:

The text representation of value is produced by calling Type.ToString.

Эта функция имеет перегруженный вариант, использующий параметр типа string для указания желаемого формата представления. Множество значений этого параметра ограничено предопределенным списком символов форматирования (представлены ниже), возможно, в сочетании с целочисленными значениями.

Символ форматирования Описание
C Отображение значения как валюты с использованием принятого по соглашению символа
D Отображение значения как десятичное целое
E Отображение значения в соответствии с научной нотацией
F Отображение значения как fixed Point
G Отображение значения в формате с фиксированной точкой или как десятичное целое. Общий формат
N Применение запятой для разделения порядков
X Отображение значения в шестнадцатеричной нотации

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

Форматирование используется для преобразования значений "обычных" .NET Framework типов данных в строковое представление, да еще в соответствии с каким-либо общепринятым форматом. Например, целочисленное значение 100 можно представить в общепринятом формате currency для отображения валюты. Для этого можно использовать метод ToString() с использованием символа (строки?) форматирования (" C "). В результате может быть получена строка вида " $100.00 ". И это при условии, что установки операционной системы компьютера, на котором производится выполнение данного программного кода, соответствуют U.S. English specified as the current culture (имеется в виду "Настройка языковых параметров, представление чисел, денежных единиц, времени и дат").

int MyInt = 100;
 String MyString = MyInt.ToString("C");
 Console.WriteLine(MyString);

Консольный ввод/вывод. Функции – члены класса 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);

также отработают вполне корректно.

kewezok kewezok
kewezok kewezok
Елена Шляхт
Елена Шляхт
Объясните плиз в чем отличие а++ от ++а
Почему результат разный?
int a=0, b=0;
Console.WriteLine(a++); //0
Console.WriteLine(++b); //1
a++;
++b;
Console.WriteLine(a); //2
Console.WriteLine(b); //2