Другое

Как экранировать фигурные скобки в String.Format

Узнайте правильный синтаксис для экранирования фигурных скобок в C# String.Format. Узнайте, как использовать {{ и }} для отображения буквальных скобок в форматированных строках. Полное руководство с примерами.

Как экранировать фигурные скобки в String.Format для отображения литеральных символов фигурных скобок?

Пример:

csharp
sb.AppendLine(String.Format("public {0} {1} { get; private; }", 
prop.Type, prop.Name));

Желаемый вывод:

csharp
public Int32 MyProperty { get; private set; }

Какой правильный синтаксис для экранирования фигурных скобок в методе String.Format?

Чтобы экранировать фигурные скобки в C# String.Format, нужно удвоить их — используйте {{ для представления одной { и }} для одной }. Например, String.Format("public {0} {1} {{ get; private set; }}", prop.Type, prop.Name) произведет желаемый вывод с буквальными фигурными скобками вокруг определения свойства.

Содержание

Базовый синтаксис экранирования

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

  • {{ представляет одну буквальную {
  • }} представляет одну буквальную }

Этот механизм экранирования является частью системы составного форматирования в .NET и документирован в официальной документации Microsoft.

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

Подробные примеры и сценарии

Рассмотрим различные сценарии с практическими примерами:

Пример простого свойства

Для вашего конкретного примера исправленный синтаксис будет таким:

csharp
sb.AppendLine(String.Format("public {0} {1} {{ get; private set; }}", 
    prop.Type, prop.Name));

Это произведет: public Int32 MyProperty { get; private set; }

Несколько буквальных скобок

Когда вам нужно несколько буквальных скобок подряд, продолжайте шаблон:

csharp
string result = String.Format("Этот текст содержит {{множество}} {{скобок}} подряд");
// Вывод: Этот текст содержит {множество} {скобок} подряд

Смешанные элементы форматирования и буквальные скобки

Комбинирование заполнителей форматирования с буквальными скобками:

csharp
string name = "Иван";
int age = 30;
string bio = String.Format("{{Персона}}: {0}, Возраст: {1}", name, age);
// Вывод: {Персона}: Иван, Возраст: 30

Вывод, похожий на JSON

Создание JSON-структур с использованием String.Format:

csharp
string json = String.Format("{{\"name\": \"{0}\", \"age\": {1}}}", "Алиса", 25);
// Вывод: {"name": "Алиса", "age": 25}

Экранирование внутри элементов форматирования

Когда элементы форматирования сами нуждаются в фигурных скобках:

csharp
string format = "Значение: {0:{{0.00}}}";
string result = String.Format(format, 123.456);
// Вывод: Значение: {123.46}

Интерполяция строк с фигурными скобками

C# 6 представил интерполяцию строк, которая также требует экранирования фигурных скобок, но с немного другим синтаксисом:

Базовое экранирование в интерполируемых строках

csharp
string name = "Мир";
string interpolated = $"Hello {{{name}}}!";
// Вывод: Hello {Мир}!

Многоуровневое экранирование

Для более сложных сценариев, требующих нескольких уровней экранирования:

csharp
string value = "тест";
string complex = $"{{{{{value}}}}}";
// Вывод: {{тест}}

Комбинирование интерполяции с форматированием

csharp
double price = 19.99;
string result = $"Цена: {{{price:C}}}";
// Вывод: Цена: {$19.99}

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

Распространенные ошибки и лучшие практики

Распространенные ошибки

  1. Использование экранирования обратным слэшем: Многие разработчики сначала пытаются использовать \{ и \}, но это не работает для String.Format:

    csharp
    string wrong = "public {0} {1} \{ get; private set; \}"; // Неверно!
    
  2. Неравное количество скобок: Всегда убедитесь, что экранированные скобки идут парами:

    csharp
    string uneven = "{{unmatched}"; // Вызовет FormatException
    
  3. Забыть экранировать в сложных сценариях: При комбинировании нескольких элементов форматирования и литералов легко пропустить некоторые скобки.

Лучшие практики

  1. Используйте буквенные строки для сложного форматирования: При работе с множеством скобок буквенные строки могут улучшить читаемость:

    csharp
    string complex = @"public {0} {1} {{ 
        get; private set; 
    }}";
    
  2. Рассмотрите использование StringBuilder для множественных добавлений: При построении сложных строк StringBuilder может быть более эффективным:

    csharp
    sb.Append("public ");
    sb.Append(prop.Type);
    sb.Append(" ");
    sb.Append(prop.Name);
    sb.AppendLine(" { get; private set; }");
    
  3. Используйте буквенные литералы строк (C# 11+): Последние версии C# поддерживают буквенные литералы строк, которые могут упростить сложное форматирование:

    csharp
    string raw = """public {type} {name} { get; private set; }""";
    

Продвинутые сценарии форматирования

Условное форматирование со скобками

csharp
bool hasValue = true;
string result = String.Format("Условие: {0} {{ {1} }}", 
    hasValue ? "true" : "false", 
    hasValue ? "Значение существует" : "Нет значения");
// Вывод: Условие: true { Значение существует }

Вложенные скобки в строках форматирования

csharp
string nested = String.Format("Внешняя {{ Внутренняя {0} }}", "содержимое");
// Вывод: Внешняя { Внутренняя содержимое }

Локализация и форматирование

При работе с локализованными строками, которым нужны скобки:

csharp
string localized = String.Format(
    CultureInfo.CurrentCulture,
    "Формат: {{0}} отформатировано как {0:C}",
    123.45);

Альтернативные подходы

Использование String.Concat

Для простых случаев, когда вам не нужно форматирование, конкатенация может быть проще:

csharp
string result = "public " + prop.Type + " " + prop.Name + " { get; private; }";

Использование шаблонных методов

Для повторяющихся шаблонов форматирования рассмотрите использование шаблонных методов:

csharp
public static string FormatProperty(string type, string name)
{
    return $"public {type} {name} {{ get; private set; }}";
}

Использование StringBuilder для сложного построения

Для построения сложных строк с множеством элементов:

csharp
var sb = new StringBuilder();
sb.Append("public ");
sb.Append(prop.Type);
sb.Append(" ");
sb.Append(prop.Name);
sb.AppendLine(" { get; private set; }");

Заключение

Экранирование фигурных скобок в C# String.Format является простым, как только вы понимаете основное правило: удваивайте каждую скобку, которую хотите отобразить как буквальный символ ({{ для { и }} для }). Этот подход работает последовательно во всех методах форматирования .NET и необходим для создания строк, которым нужно отображать фигурные скобки буквально.

Ключевые выводы:

  • Всегда используйте {{ и }} для экранирования буквенных скобок в строках форматирования
  • Это применяется как к String.Format, так и к интерполяции строк (с префиксом $)
  • Будьте осторожны с сложными вложенными сценариями и рассмотрите использование буквенных строк или StringBuilder для лучшей читаемости
  • Помните, что экранирование обратным слэшем (\{) не работает для String.Format — оно предназначено специально для символьных и строковых литералов, а не для строк форматирования

Освоение экранирования фигурных скобок поможет вам избежать распространенных ошибок FormatException и создать более надежный код форматирования строк в ваших приложениях C#.

Источники

  1. Stack Overflow - Escape curly brace in String.Format
  2. Code Maze - How to Escape Curly Brackets and Special Characters in C#
  3. Stack Overflow - C# String.Format with Curly Bracket in string
  4. C# Tips - Escape curly brace in string.Format()
  5. Riptional - Escaping curly brackets inside a string format
  6. Microsoft Documentation - Composite Formatting
  7. Stack Overflow - How to escape braces (curly brackets) in a format string in .NET
Авторы
Проверено модерацией
Модерация