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





[править: в то время заданный вопрос о StringList]
Вы имеете в виду StringCollection? Первоначально здесь используется пустой ArrayList, поэтому ответ - 0. И у вас нет возможности его изменить. Когда вы впервые добавляете предмет, его емкость увеличивается до 4, а при заполнении используется стратегия удвоения.
Если вы имеете в виду List<string>, то он похож (пустой T[], а не ArrayList), но вы можете инициализировать известный размер, если вам нужно (т.е. вы знаете, сколько данных ожидаете). Опять же, при первом подключении Add к List<T> размер увеличивается до 4, а затем удваивается каждый раз, когда он заполняется.
прочитайте услышите о Емкость струностроителя, есть образец приложения, чтобы доказать это.
Эта связанная статья относится к максимальной вместимости. Не емкость по умолчанию (16).
Достопочтенный Дж. Скит дал хороший анализ именно этой проблемы:
https://jonskeet.uk/csharp/stringbuilder.html
Это хорошее напоминание, что я должен отредактировать статью, включив где-нибудь слово «емкость» :)
Хорошая статья, но не отвечает ни на один вопрос.
@JonSkeet - по-прежнему отсутствует слово capacity. Тем не менее, интересная статья.
В этом ответе нет никаких подробностей, только ссылка.
Емкость 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 символов.
Так что не нужно беспокоиться о сохранении длинного ответа !!!
Можете добавить ссылку на документацию, где это подтверждается?
Я пробовал в своем проекте. Если вы хотите попробовать, вы можете попрактиковаться в dotnetfiddle.net.
Я думаю, он имел в виду StringBuilder, и ничего больше.