2013-05-03 3 views
-3

При добавлении текста в строку я должен использовать:Должен ли я использовать добавить строку или + =

var myStringBuilder = new StringBuilder(); 
myStringBuilder.AppendLine("some text"); 

или

var myString = ""; 
myString += ("some text"); 

и почему?

+1

Справедливости ради, это не дублирующий вопрос - он фокусируется на том, почему 'StringBuilder' быстрее, чем отдельные конкатенации строк, а не на этом конкретном вопросе о том, почему альтернативный синтаксис также работает * на StringBuilder * и являются ли эти два функциональными идентичны. Кроме того, в этой другой теме есть некоторые вещи, которые не совсем верны. В хорошо подготовленном случае множественные конкатенации никогда не превзойдут «StringBuilder», если вы правильно выбрали начальную емкость с помощью [альтернативного конструктора] (http://msdn.microsoft.com/en-us/library/h1h0a5sy.aspx). –

+0

@PhaDaPhunk Вы имеете в виду 'myString.Append()' вместо 'AppendLine', который предположительно дал бы другой результат по сравнению с' + = 'из-за' AppendLine', вызывающего 'Environment.NewLine' внутренне, или я пропустил что-то ? – DGibbs

ответ

3

Если вы собираетесь добавить несколько строк, StringBuilder.AppendLine будет лучше по производительности. Если это всего лишь один, используйте +=.

+= каждый раз, когда вы это называете, создаст совершенно новый, неизменный, string. StringBuilder использует внутренний буфер расширения, а затем, когда вы хотите использовать строковый вызов. StringBuilder.ToString()

+0

Предполагается, что реализация operator + для StringBuilder такая же, как для строки. Почему это так? Его можно было бы легко внутренне вызвать Append. –

+1

В 'StringBuilder' нет + =. Я считаю, что этот вопрос может вызвать некоторую путаницу. Класс 'string' имеет оператор' + = '. –

1

Вы всегда должны использовать функцию AppendLine и ее функции брата. Второй синтаксис работает, но только потому, что доступно достаточное количество неявных преобразований. Даже для одного добавления он будет менее результативным, чем вариант Append, так как он делает некоторые дополнительные строковые выделения внутри, чтобы добавить append, в то время как StringBuilder уже имеет зарезервированное пространство. Я бы не удивился, если бы представительный тест показал, что первый пример был как минимум в 3 раза быстрее второго, для одного добавления.

Смежные вопросы