Характеристика | String | StringBuilder |
---|---|---|
Изменяемость | Неизменяемый (immutable) | Изменяемый (mutable) |
Тип | Reference type | Reference type |
Назначение | Для статичного текста | Для динамического построения строк |
Производительность | Медленно при модификациях | Быстро при модификациях |
Потокобезопасность | Потокобезопасен | Не потокобезопасен |
String - создает новый объект при каждой операции:
string str = "Hello";
str += " World"; // Создается НОВЫЙ объект в памяти
StringBuilder - модифицирует существующий буфер:
var sb = new StringBuilder("Hello");
sb.Append(" World"); // Модификация существующего буфера
Пример с String (неэффективно):
string result = "";
for (int i = 0; i < 1000; i++) {
result += i.ToString(); // 1000 новых объектов!
}
То же самое с StringBuilder (эффективно):
var sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.Append(i.ToString()); // Один объект модифицируется
}
string result = sb.ToString();
String:
StringBuilder:
StringBuilder предоставляет специальные методы для работы:
var sb = new StringBuilder("Initial");
sb.Append(" text"); // Добавление в конец
sb.Insert(0, "Start "); // Вставка в начало
sb.Replace("Initial", "New"); // Замена подстроки
sb.Remove(5, 3); // Удаление части строки
Используйте String, когда:
Используйте StringBuilder, когда:
Пример с String:
string s1 = "A";
string s2 = s1 + "B"; // 2 операции выделения памяти
string s3 = s2 + "C"; // Еще одно выделение
Пример с StringBuilder:
var sb = new StringBuilder();
sb.Append("A"); // Выделение начального буфера
sb.Append("B"); // Использование существующего буфера
sb.Append("C"); // Использование существующего буфера
string result = sb.ToString(); // Финальное выделение
Преобразование в строку:
var sb = new StringBuilder("Text");
string finalString = sb.ToString(); // Создается string
Capacity в StringBuilder: Можно задать начальный размер буфера для оптимизации:
var sb = new StringBuilder(1024); // Буфер на 1024 символа
Не злоупотребляйте StringBuilder: Для простых конкатенаций из 2-3 строк обычный string может быть лучше
String предназначен для работы с неизменяемыми строками и обеспечивает безопасность, в то время как StringBuilder оптимизирован для построения строк через многократные модификации. Выбор между ними должен основываться на конкретном сценарии использования, учитывая требования к производительности и необходимость изменений строки.