string и StringBuilder — что выбрать
using System.Text;
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++)
{
sb.Append(i);
if (i < 5)
{
sb.Append(", ");
}
}
string result = sb.ToString();
Console.WriteLine(result);
Console.WriteLine(result.Length);1, 2, 3, 4, 5
13StringBuilder — изменяемая строка: в неё можно дописывать, вставлять и заменять, не создавая каждый раз новую. Готовую строку из неё получают методом ToString(). Класс лежит в System.Text, поэтому в начале файла нужна строка using System.Text;.
Зачем он нужен
Обычная строка string неизменяема. Запись s += "x" не дописывает символ в старую строку, а создаёт новую: копирует всё старое содержимое и добавляет хвост. В цикле на тысячи итераций это тысячи копий всё более длинных строк, и программа заметно тормозит:
string s = "";
for (int i = 0; i < 100000; i++)
{
s += i;
}
Console.WriteLine(s.Length);StringBuilder хранит текст в запасе памяти и дописывает на место, копируя содержимое, только когда запас кончается. Тот же цикл с sb.Append(i) работает во много раз быстрее.
Основные методы
using System.Text;
StringBuilder sb = new StringBuilder("Привет");
sb.Append(", мир");
sb.Insert(0, ">> ");
sb.Replace("мир", "C#");
sb.AppendLine("!");
sb.Append("конец");
Console.WriteLine(sb.ToString());
Console.WriteLine(sb.Length > 0);>> Привет, C#!
конец
True| Метод | Что делает |
|---|---|
Append(x) | дописать в конец (строку, число, символ) |
AppendLine(x) | дописать и перевести строку |
Insert(i, x) | вставить на место i |
Replace(a, b) | заменить все a на b |
Remove(i, n) | удалить n символов начиная с i |
Clear() | очистить |
Length | текущая длина |
ToString() | готовая строка |
Append возвращает тот же StringBuilder, поэтому вызовы можно писать цепочкой: sb.Append("x = ").Append(5).AppendLine();.
Когда хватает обычной строки
- Несколько склеиваний в одной строке кода —
+или интерполяция$"...":$"{name}, {age} лет". ЗдесьStringBuilderтолько усложнит код. - Элементы массива или списка через разделитель —
string.Join(", ", items): он сам считает нужный размер и работает быстро. StringBuilderнужен, когда текст собирают по кусочкам в цикле или в нескольких местах программы.
Подводные камни
- Забыли
using System.Text;— ошибкаThe type or namespace name 'StringBuilder' could not be found(CS0246). Console.WriteLine(sb)тоже печатает текст — он сам вызываетToString(). А вот сравниватьStringBuilderсо строкой через==нельзя: сначалаsb.ToString() == "...".AppendLineдобавляет перевод строки текущей системы: в Windows — два символа\r\n, в Linux и macOS —\n.