Иммутабельность строк?

1) В чём преимущество неизменяемости строк? В c# операции со строками возвращают новые объект. Далее в справке написано, что это очень сильно влияет на производительность. Тогда зачем эта хеш-таблица строк вообще существует? Какие плюсы, какие минусы?

2) Пишу программу, которая постоянно работает со строками (много раз в секунду). Причём строки используются не только для отображения текста, но и для кодирования чисел, логических значений и т.п. Планирую положится на "мозги" языка в этом вопросе. Но какой способ хранения, обработки и конвертирования строк наиболее оптимальный в данном случае?

3) Пишу на C# и JavaScript. Какие методы, встроенные в эти языки, лучше всего будет использовать? В шарпе сейчас использую StringBuilder.
  • Вопрос задан
  • 2873 просмотра
Решения вопроса 3
@Sumor
1. Неизменяемость строк используется при операциях сравнения - сравниваются только указатели. Ещё есть вопросы экономии места при повторном использовании, но не уверен, что здесь можно много выиграть.
2. Для активной работы со строками как раз и используются StringBuilder. по сути они представляют собой выделенный массив большого размера, в рамках которого происходит работа со строкой. Во время манипуляций новый массив не создаётся - всё происходит по месту, если не превышается выделенный размер. Если буфера не хватит - выделяется новый, большего размера. Текущий размер буфера можно узнать из свойства Capacity, его можно сразу задать достаточно большим.
Ответ написан
@D3lphi
Для начала, нужно понимать, что строка - это, по сути, массив символов. Длину массива изменять не принято. Это, конечно, можно сделать, но операция изменения размера массива очень ресурсозатратная. Массив - это данные, которые записаны в памяти последовательно. При попытке изменить размер массива, нет никакой гарантии, что после последнего элемента в массиве есть свободная память, следовательно приходится копировать массив в свободную область памяти. Собственно, по этой причине, размер массива не изменяют.

Для того, чтобы произвести, какие-либо операции над строкой, нужно изменить массив символов.
Ответ написан
art1z
@art1z
Программист-многостаночник в EffectiveSoft
1) Любые операции сравнения и сортировки строк работают намного быстрее. Часто используемые Dictionary словари получаются очень быстрыми. И самое главное - строки в дотнете thread-safe
2)/3) Не надо преждевременной оптимизации, стандартных методов более чем достаточно, для конкатенации строк - темплейтные строки ($""), StringBuilder или стримы, если объемы очень большие. Строки же для "кодирования чисел" - это что-то нездоровое в архитектуре.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08 Куратор тега JavaScript
Если ты можешь взять, выделить любой кусок памяти под свои нужды, а потом взять и расширить его, без выделения нового участка с нужным размером, то таким способом ты сможешь решить свою проблему. Просто сделай это, в C# есть все необходимое для работы с памятью. Но сможешь ли ты с этим справиться, чтоб не возникало ошибок и будет ли это решение быстрее банального копирования одного участка памяти в другой?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы