т.д. Запомните, что порядковые числа заполнителей в фигурных скобках всегда начинаются с
0
. Остальные параметры
WriteLine()
— это просто значения, подлежащие вставке вместо соответствующих заполнителей.
На заметку! Если уникально нумерованных заполнителей больше, чем заполняющих аргументов, тогда во время выполнения будет сгенерировано исключение, связанное с форматом. Однако если количество заполняющих аргументов превышает число заполнителей, то лишние аргументы просто игнорируются.
Отдельный заполнитель допускается повторять внутри заданной строки. Например, если вы битломан и хотите построить строку "9, Number 9, Number 9"
, тогда могли бы написать такой код:
// Джон говорит...
Console.WriteLine("{0}, Number {0}, Number {0}", 9);
Также вы должны знать о возможности помещения каждого заполнителя в любую позицию внутри строкового литерала. К тому же вовсе не обязательно, чтобы заполнители следовали в возрастающем порядке своих номеров, например:
// Выводит: 20, 10, 30
Console.WriteLine("{1}, {0}, {2}", 10, 20, 30);
Строки можно также форматировать с использованием интерполяции строк, которая рассматривается позже в главе.
Форматирование числовых данных
Если для числовых данных требуется более сложное форматирование, то каждый заполнитель может дополнительно содержать разнообразные символы форматирования, наиболее распространенные из которых описаны в табл. 3.3.
Символы форматирования добавляются к заполнителям в виде суффиксов после двоеточия (например, {0:С}
, {1:d}
, {2:X}
). В целях иллюстрации измените метод Main()
для вызова нового вспомогательного метода по имени FormatNumericalData()
, реализация которого в классе Program
форматирует фиксированное числовое значение несколькими способами.
// Демонстрация применения некоторых дескрипторов формата,
static void FormatNumericalData()
{
Console.WriteLine("The value 99999 in various formats:");
Console.WriteLine("c format: {0:c}", 99999);
Console.WriteLine("d9 format: {0:d9}", 99999);
Console.WriteLine("f3 format: {0:f3}", 99999);
Console.WriteLine("n format: {0:n}", 99999);
// Обратите внимание, что использование для символа
// шестнадцатеричного формата верхнего или нижнего регистра
// определяет регистр отображаемых символов.
Console.WriteLine("E format: {0:E}", 99999);
Console.WriteLine("e format: {0:e}", 99999);
Console.WriteLine("X format: {0:X}", 99999);
Console.WriteLine("x format: {0:x}", 99999);
}
Ниже показан вывод, получаемый в результате вызова метода FormatNumericalData()
.
The value 99999 in various formats:
c format: $99,999.00
d9 format: 000099999
f3 format: 99999.000
n format: 99,999.00
E format: 9.999900E+004
e format: 9.999900e+004
X format: 1869F
x format: 1869f
В дальнейшем будут встречаться и другие примеры форматирования; если вас интересуют дополнительные сведения о форматировании строк, тогда обратитесь в документацию по .NET Core (https://docs.microsoft.com/ru-ru/dotnet/standard/base-types/formatting-types
).
Форматирование числовых данных за рамками консольных приложений
Напоследок следует отметить, что применение символов форматирования строк не ограничено консольными приложениями. Тот же самый синтаксис форматирования может быть использован при вызове статического метода string.Format()
. Прием удобен, когда необходимо формировать выходные текстовые данные во время выполнения в приложении любого типа (например, в настольном приложении с графическим пользовательским интерфейсом, веб-приложении ASP.NET Core и т.д.).
Метод string.Format()
возвращает новый объект string
, который форматируется согласно предоставляемым флагам. Приведенный ниже код форматирует строку с шестнадцатеричным представлением числа:
// Использование string.Format() для форматирования строкового литерала.
string userMessage = string.Format("100000 in hex is {0:x}", 100000);
Работа с системными типами данных и соответствующими ключевыми словами C#
Подобно любому языку программирования для фундаментальных типов данных в C# определены ключевые слова, которые используются при представлении локальных переменных, переменных-членов данных в классах, возвращаемых значений и параметров методов. Тем не менее, в отличие от других языков программирования такие ключевые слова в C# являются чем-то большим, нежели просто лексемами, распознаваемыми компилятором. В действительности они представляют собой сокращенные обозначения полноценных типов из пространства имен System
. В табл. 3.4 перечислены системные типы данных вместе с их диапазонами значений, соответствующими ключевыми словами C# и сведениями о совместимости с общеязыковой спецификацией (CLS). Все системные типы находятся в пространстве имен System, которое ради удобства чтения не указывается.
На заметку! Вспомните из главы 1, что совместимый с CLS код .NET Core может быть задействован в любом другом управляемом языке программирования .NET Core. Если в программах открыт доступ к данным, не совместимым с CLS, тогда другие языки .NET Core могут быть не в состоянии их использовать.
Объявление и инициализация переменных
Для объявления локальной переменой (например, переменной внутри области видимости члена) необходимо указать тип данных, за которым следует имя переменной. Создайте новый проект консольного приложения по имени BasicDataTypes
и добавьте его в свое решение с применением следующих команд:
dotnet new console -lang c# -n BasicDataTypes -o .BasicDataTypes -f net5.0
dotnet sln .Chapter3_AllProjects.sln add .BasicDataTypes
Обновите код, как показано ниже:
using System;
using System.Numerics;
Console.WriteLine("***** Fun with Basic Data Types *****n");
Теперь добавьте статическую локальную функцию LocalVarDeclarations()
и вызовите ее в операторах верхнего уровня:
static void LocalVarDeclarations()
{
Console.WriteLine("=> Data Declarations:");
// Локальные переменные объявляются так:
// типДанных имяПеременной;
int myInt;
string myString;
Console.WriteLine();
}
Имейте в виду, что использование локальной переменной до присваивания ей начального значения приведет к ошибке на этапе компиляции. Таким образом, рекомендуется присваивать начальные значения локальным переменным непосредственно при их объявлении, что можно делать в одной строке или разносить объявление и присваивание на два отдельных оператора кода.
static void LocalVarDeclarations()
{
Console.WriteLine("=> Data Declarations:");
// Локальные переменные объявляются и инициализируются так:
// типДанных имяПеременной = начальноеЗначение;
int myInt = 0;
// Объявлять и присваивать можно также в двух отдельных строках.
string myString;
myString = "This is my character data";
Console.WriteLine();
}
Кроме того, разрешено объявлять несколько переменных того же самого типа в одной строке кода, как в случае следующих трех переменных bool
:
static void LocalVarDeclarations()
{
Console.WriteLine("=> Data Declarations:");
int myInt = 0;
string myString;
myString =