Когда использовать 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 лучше всего использовать, когда точное количество конкатенаций неизвестно во время компиляции.

Ответ 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.