@SergeySerge11

Почему StringBuilder при вызове метода ToString() копирует содержимое?

Он создает грубо говоря массив char[] , а String вроде как и состоит из массива char[] , Дак почему не передать ссылку или указатель, или сам объект в памяти как-то перестроить. Не понимаю, почему так сделSали.
Потом как правило объект StringBuilder находиться в методе, и сразу. умирает, то есть он вполне может использовать стек а не кучу.
Потом вообще почему любое new String (char[] ) копирует массив? почему не оборачивает. Почему не создать строку на основе этого массива. Даже String(char*) по указателю то же самое. И в java то же самое. А почему так? Ведь вроде можно быстрее.(Или я где-то ошибаюсь в рассуждениях)

Или Есть ли какие методы, как можно, допустим зная, где в памяти лежит строка, ее адрес, получить объект String или какой другой на ее основе?
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 2
Alexeytur
@Alexeytur
String и char[] это разные вещи с точки зрения среды выполнения. char[] это изменяемый объект, можно по индексу изменить значение отдельного элемента. String это неизменяемый объект, операции изменения строки на самом деле создают копии оригинального объекта строки.
Поэтому, если нужно создать строку через множество операций, используют StringBuilder, чтобы не было множества выделений/освобождений памяти.
Ответ написан
Комментировать
vabka
@vabka Куратор тега C#
Токсичный шарпист

Потом как правило объект StringBuilder находиться в методе, и сразу. умирает, то есть он вполне может использовать стек а не кучу

Нет, не может, тк размер финальной строки заранее не известен, а если очень много памяти на стеке выделять, то его просто порвёт.


Потом вообще почему любое new String (char[] ) копирует массив? почему не оборачивает

Потому что string имеет контракт "никогда и ни при каких условиях содержимое строки не будет изменено". Если просто оборачивать, то этот контракт легко будет нарушить.

А так да, можно и быстрее, если ты сможешь доказать, что ты никак не изменишь буфер, на котором основана строка после того, как можно будет использовать экземпляр string.

Например как в случае со string.Create где ты можешь прокинуть лямбду, котороя сможет как угодно менять содержимое строящейся строки.
string.Create выделяет память только один раз
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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