Объединение строк в C#

Tip

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

Вы пришли из другого языка? Объединение C# с + параллелями Java и JavaScript. C# добавляет интерполяцию строк ($"{x}"), аналогичную литералам шаблонов JavaScript и Python f-strings, как предпочтительный способ построения строк из переменных. Для построения строк в цикле C# предлагает StringBuilder, подобно StringBuilder в Java.

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

Сцепляйте строковые литералы

При объединении строковых литералов или констант с помощью + компилятор объединяет их на этапе компиляции. Разделение длинного литерала на несколько строк повышает читабельность исходного кода без каких-либо затрат во время выполнения:

// The compiler joins adjacent string literals at compile time,
// so splitting a long literal across lines has no run-time cost.
string message =
    "This is the first sentence of a longer message. " +
    "This is the second sentence. " +
    "This is the third and final sentence.";

Console.WriteLine(message);
// => This is the first sentence of a longer message. This is the second sentence. This is the third and final sentence.

Использовать операторы + и +=

Чтобы объединить строковые переменные, используйте + оператор для создания новой строки или += добавления к существующей. Оператор + интуитивно понятный, и компилятор копирует строковое содержимое только один раз, даже если вы привязываете несколько операторов в одном выражении:

string name = "Alex";
string day = "Monday";

// Use + to build a string from variables and literals.
string greeting = "Hello " + name + ". Today is " + day + ".";
Console.WriteLine(greeting);
// => Hello Alex. Today is Monday.

// Use += to append to an existing string.
greeting += " How are you today?";
Console.WriteLine(greeting);
// => Hello Alex. Today is Monday. How are you today?

Замечание

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

Использование интерполяции строк

Чтобы встраивать вычисляемые выражения в строку, предпочтительнее использовать интерполяцию строк вместо позиционных подстановок, таких как токены {0} и {1}, которые String.Format наследует из форматирования в стиле C. Интерполяция помещает каждое выражение в строку, в которой отображается его значение, поэтому результируемая строка остается удобочитаемой, и аргумент не может быть неправильно указан:

string name = "Alex";
string day = "Monday";

// String interpolation reads better than a chain of + operators.
string greeting = $"Hello {name}. Today is {day}.";
Console.WriteLine(greeting);
// => Hello Alex. Today is Monday.

Когда каждое интерполированное выражение является константной строкой, можно назначить интерполированный результат строке const .

Присоединение к коллекции строк

Чтобы объединить элементы коллекции, используйте String.Concat для объединения их без разделителя или String.Join размещения разделителя между каждым элементом:

string[] words = ["The", "quick", "brown", "fox"];

// Concat joins the sequence with no separator.
string runTogether = string.Concat(words);
Console.WriteLine(runTogether);
// => Thequickbrownfox

// Join places a separator between each element.
string sentence = string.Join(' ', words);
Console.WriteLine(sentence);
// => The quick brown fox

string.Join — это правильное средство, когда требуется вывод с разделителями, например значения с разделителями-запятыми или слова, разделенные пробелами.

Создать строку в цикле

Каждая операция + или += создает новую строку, поскольку строки неизменяемы. Когда вы добавляете много фрагментов в цикле, затраты на выделение памяти накапливаются. Класс StringBuilder создает результат в одном буфере.

// StringBuilder builds a string in place, which suits loops
// that append many pieces.
var builder = new StringBuilder();
for (int i = 1; i <= 3; i++)
{
    builder.AppendLine($"Line {i}");
}

Console.Write(builder.ToString());
// => Line 1
// => Line 2
// => Line 3

Используйте StringBuilder, если число элементов велико или неизвестно на этапе компиляции. Для небольшого фиксированного набора значений оператор + и интерполяция строк более понятны. Сведения о том, в каких случаях каждый подход работает лучше всего, см. в разделе Типы string и StringBuilder.

См. также