Емкость StringBuilder по умолчанию

Какова емкость StringBuilder по умолчанию?

И когда следует (или не следует) использовать значение по умолчанию?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
35
0
31 493
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

[править: в то время заданный вопрос о StringList]

Вы имеете в виду StringCollection? Первоначально здесь используется пустой ArrayList, поэтому ответ - 0. И у вас нет возможности его изменить. Когда вы впервые добавляете предмет, его емкость увеличивается до 4, а при заполнении используется стратегия удвоения.

Если вы имеете в виду List<string>, то он похож (пустой T[], а не ArrayList), но вы можете инициализировать известный размер, если вам нужно (т.е. вы знаете, сколько данных ожидаете). Опять же, при первом подключении Add к List<T> размер увеличивается до 4, а затем удваивается каждый раз, когда он заполняется.

Я думаю, он имел в виду StringBuilder, и ничего больше.

Boris Callens 29.10.2008 12:38

прочитайте услышите о Емкость струностроителя, есть образец приложения, чтобы доказать это.

Эта связанная статья относится к максимальной вместимости. Не емкость по умолчанию (16).

Matt Lacey 29.10.2008 12:44
Ответ принят как подходящий

Достопочтенный Дж. Скит дал хороший анализ именно этой проблемы:

https://jonskeet.uk/csharp/stringbuilder.html

Это хорошее напоминание, что я должен отредактировать статью, включив где-нибудь слово «емкость» :)

Jon Skeet 29.10.2008 13:38

Хорошая статья, но не отвечает ни на один вопрос.

Webveloper 07.03.2011 22:07

@JonSkeet - по-прежнему отсутствует слово capacity. Тем не менее, интересная статья.

flacnut 03.04.2013 13:17

В этом ответе нет никаких подробностей, только ссылка.

GaTechThomas 15.09.2016 00:28

Емкость StringBuilder по умолчанию составляет 16 символов (чтобы выяснить это, я использовал .NET Reflector).

По умолчанию - 16, что кажется емкостью по умолчанию для любого типа массива или списка в .NET framework. Чем меньше перераспределений вам нужно в StringBuilder, тем лучше. Между тем, выделять гораздо больше, чем нужно, тоже нет необходимости.

Я обычно создаю экземпляр StringBuilder с некоторой приблизительной оценкой окончательного размера StringBuilder. Например, это может быть основано на некотором количестве итераций, которое вы будете использовать позже для построения строки, умноженном на размер, необходимый для каждого элемента в этой итерации.

// where 96 is a rough estimate of the size needed for each item
StringBuilder sb = new StringBuilder ( count * 96 );
for ( int i = 0; i < count; i++ )
{
...
}

Когда размер StringBuilder слишком мал для записи следующей строки, внутренний массив символов StringBuilder перераспределяется в два раза больше текущего размера.

Этот вопрос возник сегодня как дубликат другого, но я заметил, что на одну часть ответа не было. По умолчанию (при условии, что это означает, что «когда не создана строка, которая достаточно велика, чтобы требовать»), как говорят люди, - 16, но я не вижу здесь ничего о том, когда вы должны это изменить.

Вы меняете его, когда можете сделать это в качестве возможной оптимизации. Действительно, выбор 16 противоположен оптимизации. Оптимизация выбирает значения и подходы так, чтобы они особенно хорошо подходили для конкретного случая или подмножества возможных случаев (не «ускоряя работу» в целом, хотя мы часто используем это слово). Здесь разработчику класса пришлось иметь дело с обобщение - подбором значений и подходов, чтобы обеспечить достаточно хорошую производительность в широком диапазоне случаев.

Чем меньше они были, тем меньше использовалось памяти.

Чем больше они были, тем меньше было перераспределения для работы с более крупными строками.

Есть несколько причин, по которым двоичное округление (целые степени двойки) в определенных случаях может дать лучшую производительность, чем другие числа, поэтому они выбрали одну из них, но выбор между 4 или 16 или 1024 был вопросом уравновешивание различных вероятных значений.

Кто-то с использованиемStringBuilder вместо того, чтобы проектировать его, может иметь лучшее представление о том, какой размер им, вероятно, понадобится.

Если они собираются использовать Append 5 однозначных чисел вместе со строками, общая длина которых составляет 43 символа, то общая длина StringBuilder будет 48 символов, несмотря ни на что, поэтому они должны использовать емкость 48 как 48 символов. всегда самый эффективный размер для строки длиной 48.

Если они делают что-то, где может быть любая длина от 23 до 34 символов, им следует использовать 34.

Если они делают что-то, где, вероятно, никогда не будет больше 60 символов, но время от времени они могут быть, им следует использовать 64 (не перераспределять для большинства частей и получить преимущество степени двойки, упомянутое выше для несколько случаев, когда вы это делаете).

Если по этому поводу невозможно прийти к заключению или, по крайней мере, сделать это сложно, а не из-за проблем с производительностью, тогда вам следует просто использовать значение по умолчанию.

Мы можем найти емкость, используя свойство capacity класса StringBuilder:

StringBuilder builder = new StringBuilder();
var capacity = builder.Capacity;
var maxCapacity = builder.MaxCapacity;

Здесь емкость определяет емкость StringBuilder по умолчанию.

StringBuilder - это Max Capacity, такое же, как максимальное значение Int32.

Емкость String-Builder по умолчанию - 16 символов, А максимальная емкость String-Builder составляет 2147483647 символов.

Так что не нужно беспокоиться о сохранении длинного ответа !!!

Можете добавить ссылку на документацию, где это подтверждается?

Noel Widmer 11.10.2017 09:33

Я пробовал в своем проекте. Если вы хотите попробовать, вы можете попрактиковаться в dotnetfiddle.net.

Deep Jadia 12.10.2017 08:16

Другие вопросы по теме