Когда использовать StringBuilder?
Возможный дубликат:
String vs StringBuilder
Я только что просмотрел некоторые из книг, которые я использовал для получения VB.NET. Я не уверен, что это у меня в голове, понять, как/что такое StringBuilder.
Что такое руководство для использования? Лучше ли использовать его, если вы конкатенируете 2 строки или 50?
Или, когда общая длина строки больше 128 символов?
Или вы увидите преимущество в производительности, когда вы используете его для добавления строк вместе?
В этом случае лучше использовать экземпляр StringBuilder для построения инструкции SQL, чем string.format("Select * from x where y = {0}",1)
?
Мне всегда казалось, что объявление другой переменной и включение пространства имен не выгодно для небольших конкатенаций строк, но я не уверен сейчас.
Извините, много документации говорит вам, что использовать, просто не самое лучшее.
Ответы
Ответ 1
У меня есть статья по этой теме. В итоге (скопировано внизу страницы):
- Определенно используйте StringBuilder, когда вы объединяетесь в нетривиальный цикл - особенно если вы не знаете точно (во время компиляции), сколько итераций вы совершите через цикл. Например, чтение файла за один раз, создание строки при использовании оператора + = потенциально может привести к самоубийству.
- Определенно используйте оператор конкатенации, когда вы можете (читаемо) указать все, что необходимо объединить в одном из утверждений. (Если у вас есть массив вещей для конкатенации, подумайте о вызове String.Concat явно - или String.Join, если вам нужен разделитель.)
- Не бойтесь разбить литералы на несколько конкатенированных бит - результат будет таким же. Вы можете облегчить чтение, разбив длинный литерал на несколько строк, например, без ущерба для производительности.
- Если вам нужны промежуточные результаты конкатенации для чего-то другого, кроме подачи следующей итерации конкатенации, StringBuilder не поможет вам. Например, если вы создадите полное имя от имени и фамилии, а затем добавите третью часть информации (возможно, прозвище) до конца, вам будет полезно использовать только StringBuilder, если вы этого не сделаете нужна строка (имя и фамилия + имя) для других целей (как в примере, который создает объект Person).
- Если у вас всего несколько конкатенаций, и вы действительно хотите сделать их в отдельных заявлениях, не имеет значения, в каком направлении вы идете. Какой способ более эффективен, будет зависеть от количества конкатенаций, связанных с размером строки, и от того, в каком порядке они объединены. Если вы действительно считаете, что часть кода является узким местом производительности, профилем или эталоном в обоих направлениях.
Ответ 2
Вот мое правило:
StringBuilder
лучше всего использовать, когда точное количество конкатенаций неизвестно во время компиляции.
Ответ 3
Ужас кодирования содержит хорошую статью по этому вопросу, Печальная трагедия в тесте микро-оптимизации.
Ответ 4
Лично я использую StringBuilder, когда у меня есть более одной или двух строк для конкатенации. Я не уверен, есть ли реальный успех в производительности, но я всегда читал и говорил, что регулярная конкатенация с несколькими строками создает дополнительную копию строки каждый раз, когда вы это делаете, в то время как StringBuilder сохраняет один скопируйте, пока вы не назовете окончательный ToString()
метод на нем.
Ответ 5
Кто-то понял экспериментально, что критическое число - 6. Более 6 конкатенаций в строке, и вы должны использовать StringBuilder. Не могу вспомнить, где я нашел это.
Однако обратите внимание, что если вы просто пишете это в строке:
"qwert" + "yuiop" + "asdf" + "gh" + "jkl;" + "zxcv" + "bnm" + ",."
Это преобразуется в один вызов функции (я не знаю, как записать его на VB.net)
String.Concat("qwert", "yuiop", "asdf", "gh", "jkl;", "zxcv", "bnm", ",.");
Итак, если вы делаете все конкатенации на одной строке, то не беспокойтесь о StringBuilder, потому что String.Concat эффективно выполнит все конкатенации за один раз. Это только если вы делаете их в цикле или последовательно объединяете.
Ответ 6
Мое правило - когда вы добавляете строку в цикле For или Foreach, используйте StringBuilder.