Перейти к основному содержимому

Базовое форматирование строк в C#

Объедините литеральные и переменные текстовые данные, содержащие специальные символы, форматирование и Юникод, в значимые сообщения для конечного пользователя.

Цели обучения

После завершения этого модуля вы сможете:

  • Создавать строковые данные, содержащие символы табуляции, новые строки и другие специальные символы
  • Создавать строковые данные, содержащие символы Юникода
  • Объединять строковые данные в новое строковое значение посредством конкатенации
  • Объединять строковые данные в новое значение. строковое значение через интерполяцию

Введение

Как разработчику программного обеспечения, вам часто нужно будет написать код C# для объединения и форматирования литеральных и переменных данных для создания нового значения. Это значение может быть отображено, сохранено в файле или отправлено по сети. К счастью, C# предоставляет множество способов объединения и форматирования данных.

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

В этом модуле вы будете использовать escape-последовательности символов для форматирования буквальных строк текста, включая специальные символы, включая символы табуляции и перевода строк, — даже символы из разных языков, таких как кандзи или кириллица! Вы узнаете, как объединить две строки и использовать интерполяцию строк для создания шаблона строки с заменяемыми частями.

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

Объединение строк с помощью escape-последовательностей символов

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

Escape-последовательности символов

Escape-последовательность символов — это инструкция среде выполнения вставить специальный символ, который повлияет на вывод строки. В C# последовательность escape-символов начинается с обратной косой черты \, за которой следует экранируемый символ. Например, последовательность \n добавит новую строку, а последовательность \t добавит табуляцию. В следующем коде для добавления символов новой строки и табуляции используются escape-символы:

Console.WriteLine("Hello\nWorld!");
Console.WriteLine("Hello\tWorld!");

Результат:

Hello
World!
Hello World!

Что делать, если вам нужно вставить двойные кавычки в литеральную строку? Если вы не используете escape-последовательность символов, вы запутаете компилятор, поскольку он подумает, что вы хотите преждевременно завершить строку. Компилятор не поймет назначение символов после второй двойной кавычки.

Console.WriteLine("Hello "World"!");

Редактор Visual Studio поместит красную волнистую линию под World. Но если вы все равно попытаетесь запустить код, вы увидите следующий вывод:

(1,27): error CS1003: Syntax error, ',' expected
(1,27): error CS0103: The name 'World' does not exist in the current context
(1,32): error CS1003: Syntax error, ',' expected

Чтобы справиться с этой ситуацией, используйте escape-последовательность \":

Console.WriteLine("Hello \"World\"!");

Результат:

Hello "World"!

Что делать, если вам нужно использовать обратную косую черту для других целей, например для отображения пути к файлу?

Console.WriteLine("c:\source\repos");

К сожалению, C# резервирует обратную косую черту для escape-последовательностей, поэтому если вы запустите код, компилятор отобразит следующую ошибку:

(1,22): error CS1009: Unrecognized escape sequence

Проблема в последовательности \s. \r не вызывает ошибки, поскольку это допустимая escape-последовательность для возврата каретки. Однако в этом контексте вы не хотите использовать возврат каретки. Чтобы решить эту проблему, вы используете \\ для отображения одной обратной косой черты.

Console.WriteLine("c:\\source\\repos");

Экранирование символа обратной косой черты дает желаемый результат:

c:\source\repos

Форматирование вывода с использованием escape-последовательностей символов

Чтобы создать макет инструмента командной строки, введите в редакторе следующий код:

Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ... \n");
Console.WriteLine("Invoice: 1021\t\tComplete!");
Console.WriteLine("Invoice: 1022\t\tComplete!");
Console.WriteLine("\nOutput Directory:\t");

Убедитесь что ваш результат соответствует следующему:

Generating invoices for customer "Contoso Corp" ...

Invoice: 1021 Complete!
Invoice: 1022 Complete!

Output Directory:

Дословный строковый литерал

Дословный строковый литерал сохранит все пробелы и символы без необходимости экранирования обратной косой черты. Чтобы создать дословную строку, используйте директиву @ перед буквальной строкой.

Console.WriteLine(@"    c:\source\repos    
(this is where your code goes)");

Обратите внимание, что строка занимает две строки, а пробелы, созданные этой инструкцией C#, сохраняются в следующем выводе.

c:\source\repos    
(this is where your code goes)

Форматирование вывода с использованием дословных строковых литералов

  1. Добавьте следующую строку кода под кодом, который вы создали ранее:
Console.Write(@"c:\invoices");
  1. Теперь запустите код. Вы увидите следующий результат, который включает "Output ditectory"
Generating invoices for customer "Contoso Corp" ...

Invoice: 1021 Complete!
Invoice: 1022 Complete!

Output Directory:
c:\invoices

Escape-символы Юникода

Вы также можете добавлять закодированные символы в литеральные строки, используя escape-последовательность \u, а затем четырехсимвольный код, представляющий некоторый символ в Юникоде (UTF-16).

// Kon'nichiwa World
Console.WriteLine("\u3053\u3093\u306B\u3061\u306F World!");

Здесь есть несколько предостережений. Во-первых, некоторые консоли, такие как командная строка Windows, не отображают все символы Юникода. Вместо этого эти символы будут заменены символами вопросительного знака. Кроме того, здесь используются примеры UTF-16. Некоторым символам требуется UTF-32 и, следовательно, требуется другая escape-последовательность. Это сложная тема, и цель этого модуля – показать вам, что возможно. В зависимости от ваших потребностей вам может потребоваться потратить немало времени на изучение и работу с символами Юникода в ваших приложениях.

Форматирование вывода с использованием escape-символов Юникода

Чтобы завершить макет инструмента командной строки, вы добавите фразу на японском языке, которая переводится как «Для создания японских счетов». Затем вы отобразите буквальную строку, представляющую команду, которую может ввести пользователь. Вы также добавите несколько escape-последовательностей для форматирования.

  1. Добавьте в свое приложение следующий код:
// To generate Japanese invoices:
// Nihon no seikyū-sho o seisei suru ni wa:
Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
// User command to run an application
Console.WriteLine(@"c:\invoices\app.exe -j");
  1. Чтобы убедиться в правильности вашего кода, сравните его со следующим:
Console.WriteLine("Generating invoices for customer \"Contoso Corp\" ...\n");
Console.WriteLine("Invoice: 1021\t\tComplete!");
Console.WriteLine("Invoice: 1022\t\tComplete!");
Console.WriteLine("\nOutput Directory:\t");
Console.Write(@"c:\invoices");

// To generate Japanese invoices:
// Nihon no seikyū-sho o seisei suru ni wa:
Console.Write("\n\n\u65e5\u672c\u306e\u8acb\u6c42\u66f8\u3092\u751f\u6210\u3059\u308b\u306b\u306f\uff1a\n\t");
// User command to run an application
Console.WriteLine(@"c:\invoices\app.exe -j");
  1. Теперь запустите код. В консоли вывода вы увидите следующий результат:
Generating invoices for customer "Contoso Corp" ...

Invoice: 1021 Complete!
Invoice: 1022 Complete!

Output Directory:
c:\invoices

日本の請求書を生成するには:
c:\invoices\app.exe -j

##Резюме Вот что вы узнали о форматировании литеральных строк:

  • Используйте escape-последовательности символов, когда вам нужно вставить специальный символ в литеральную строку, например табуляцию \t, новую строку \n или двойную кавычку \".
  • Используйте escape-символ для обратной косой черты \, когда вам нужно использовать обратную косую черту во всех других сценариях. - Используйте директиву @ для создания дословного строкового литерала, который сохраняет все символы форматирования пробелов и обратную косую черту в строке.
  • Используйте \u четырехзначный -код символа для представления символов Юникода (UTF-16) в строке. Символы Юникода могут печататься неправильно в зависимости от приложения.

Объединение строк с помощью конкатенации строк

Часто вам придется объединять данные из разных источников, включая литеральные строки и переменные, содержащие как текстовые, так и числовые данные. В этом модуле вы будете использовать конкатенацию строк для объединения двух или более значений в новую строку.

Что такое конкатенация строк?

Конкатенация строк — это, как говорят программисты, простое объединение двух или более строковых значений в новое строковое значение. В отличие от сложения, второе значение добавляется в конец первого значения и так далее. В следующем упражнении вы напишете код для объединения строковых значений.

Объединить литеральную строку и переменную

  1. Введите следующий код
string firstName = "Bob";
string message = "Hello " + firstName;
Console.WriteLine(message);
  1. Проверьте вывод:
Hello Bob

Обратите внимание на порядок: первая строка «Hello» идет первой в новой строке, а значение переменной firstName добавляется в ее конец.

Объединение нескольких переменных и литеральных строк

Вы можете выполнить несколько операций конкатенации в одной строке кода.

  1. Измените код, который вы написали ранее, следующим образом:
string firstName = "Bob";
string greeting = "Hello";
string message = greeting + " " + firstName + "!";
Console.WriteLine(message);
Hello Bob!

Избегание промежуточных переменных

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

string firstName = "Bob";
string greeting = "Hello";
Console.WriteLine(greeting + " " + firstName + "!");

Объединение строк с помощью интерполяции строк

Хотя конкатенация строк проста и удобна, интерполяция строк становится все более популярной в ситуациях, когда вам необходимо объединить множество литеральных строк и переменных в одно форматированное сообщение.

Что такое интерполяция строк?

Строковая интерполяция объединяет несколько значений в одну литеральную строку с помощью «шаблона» и одного или нескольких выражений интерполяции. Выражение интерполяции обозначается открывающей и закрывающей фигурной скобкой. В фигурные скобки можно поместить любое выражение C#, возвращающее значение. Литеральная строка становится шаблоном, если перед ней стоит символ $.

Другими словами, вместо написания следующей строки кода:

string message = greeting + " " + firstName + "!";

вы можете написать

string message = $"{greeting} {firstName}!";

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

Используйте строковую интерполяцию для объединения литеральной строки и значения переменной.

Чтобы интерполировать две строки вместе, вы создаете литеральную строку и добавляете к ней префикс символа $. Литеральная строка должна содержать хотя бы один набор фигурных скобок, а внутри этих символов вы должны использовать имя переменной.

string firstName = "Bob";
string message = $"Hello {firstName}!";
Console.WriteLine(message);

Используйте строковую интерполяцию с несколькими переменными и литеральными строками.

Измените код, который вы написали ранее, следующим образом:

int version = 11;
string updateText = "Update to Windows";
string message = $"{updateText} {version}";
Console.WriteLine(message);
Update to Windows 11

Избегайте промежуточных переменных

Как и в предыдущем упражнении, вы можете исключить временную переменную для хранения сообщения.

int version = 11;
string updateText = "Update to Windows";
Console.WriteLine($"{updateText} {version}!");

Объедините дословные литералы и строковую интерполяцию

Предположим, вам нужно использовать в шаблоне дословный литерал. Вы можете использовать как буквальный префиксный символ @, так и символ строковой интерполяции $ вместе.

string projectName = "First-Project";
Console.WriteLine($@"C:\Output\{projectName}\Data");
C:\Output\First-Project\Data

В этом примере символ $ позволяет ссылаться на переменную projectName внутри фигурных скобок, а символ @ позволяет использовать неэкранированный символ \.