Глиф Учебники

string и StringBuilder — что выбрать

Справочник · C# · 1 минута чтения

C#
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
13

StringBuilder — изменяемая строка: в неё можно дописывать, вставлять и заменять, не создавая каждый раз новую. Готовую строку из неё получают методом ToString(). Класс лежит в System.Text, поэтому в начале файла нужна строка using System.Text;.

Зачем он нужен

Обычная строка string неизменяема. Запись s += "x" не дописывает символ в старую строку, а создаёт новую: копирует всё старое содержимое и добавляет хвост. В цикле на тысячи итераций это тысячи копий всё более длинных строк, и программа заметно тормозит:

C#
string s = "";
for (int i = 0; i < 100000; i++)
{
    s += i;
}
Console.WriteLine(s.Length);

StringBuilder хранит текст в запасе памяти и дописывает на место, копируя содержимое, только когда запас кончается. Тот же цикл с sb.Append(i) работает во много раз быстрее.

Основные методы

C#
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();.

Когда хватает обычной строки

Подводные камни