Страницы

Поиск по вопросам

среда, 17 октября 2018 г.

Строки в c#. String \ StringBuilder

Ребят, у меня возникли вопросы по строкам в c#.
Чем отличается класс String от StringBuilder? Зачем нужно такое разделение? В чем преимущества того и другого? Что из этого лучше использовать? Почему StringBuilder лучше использовать для работы с большими объемами текста?
По возможности ответьте с примерами. Заранее спасибо за ответ.


Ответ

String - это строки. Они неизменяемые т.е. конкретную строку нельзя подправить/дописать/укоротить. Любые операции над строками приводят к созданию новой строки (с копированием всего текста). При этом старая строка уходит в мусор (если у вас не остается на нее ссылки).
Так сделано из соображений
Экономии памяти - не надо подстраховываться и копировать строку "на всякий случай" при передаче куда-то в другой метод. Он ее точно никак не испортит. Производительности - можно высчитывать хэш строки один раз, и не заморачиваться с поддержанием его актуальности. Это дает быстрые сравнения строк на равенство (особенно если строки разные). Безопасности - код может спокойно работать с пришедшими извне строками, не опасаясь что кто-то влезет в строку по дороге. Простоты работы с несколькими потоками - нет проблемы одновременных изменений.
Соответственно, при сборке большой строки из многих маленких эта особенность - неизменяемость строк - приводит к множественному копированию данных и к генерации большого количества мусора.
Для решения этой проблемы есть класс StringBuilder. Это не "строка", а класс для сборки строк из кусков, позволяющий в конце получить результирующую строку вызовом StringBuilder.ToString()
Если вам надо просто работать со строками - используете String Если вам надо собрать одну большую строку из пачки маленьких - используете StringBuilder

Комментариев нет:

Отправить комментарий