Фиксированное количество конкатенаций строк .NET

«... класс String предпочтительнее для операции конкатенации, если конкатенируется фиксированное количество объектов String. В этом случае отдельные операции конкатенации могут быть даже объединены компилятором в одну операцию.

Объект StringBuilder предпочтительнее для операции конкатенации, если конкатенируется произвольное количество строк..."

http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

Что меня смущает, так это неопределенные слова «может быть» в первом абзаце. Разве не должно быть "наверняка будет"? Потому что без объединения конкатенаций в одну операцию повторное выделение памяти String сделало бы его абсолютно хуже StringBuilder.


person S. Valmont    schedule 28.07.2011    source источник


Ответы (3)


Ну, это также может быть не заметной разницы. Честно говоря, они будут смехотворно близки для тривиальных конкатенаций, но: для прямой конкатенации «n» строк за одну операцию Concat (он же +) будет блистать; длина и т. д. может быть рассчитана эффективно, и тогда это просто копирование. В цикле StringBuilder будет сиять.

При объединении в одну операцию:

string s = a + b + c + x + y + z;

Это действительно:

string s = string.Concat(a, b, c, x, y, z);

Это всего лишь одна дополнительная строка.

person Marc Gravell    schedule 28.07.2011
comment
Так что не имеет значения, используются ли переменные или жестко закодированные литералы, верно? Пока конкатенации находятся в одной строке кода, они будут объединены? - person S. Valmont; 28.07.2011
comment
@SValmont - одно выражение (не одна строка), да. Обратите внимание, что если рядом находятся литералы или константы, компилятор сделает это при сборке (а не во время выполнения). - person Marc Gravell; 28.07.2011
comment
@ Ганс уверен, что есть - params - person Marc Gravell; 28.07.2011
comment
Мех, это сахар С#. Не прячьте массив. - person Hans Passant; 28.07.2011

Это говорит о том, что если длину строки можно определить во время компиляции, компилятор автоматически объединит ее для вас в более эффективное представление. Однако, если длина не может быть рассчитана во время компиляции, вы должны использовать StringBuilder.

«Может быть, даже так», если вы только объединяете две строки неопределенной длины, может быть быстрее просто использовать String. Чем больше строк объединяется, тем больше преимуществ от StringBuilder.

person robbrit    schedule 28.07.2011

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

person aepheus    schedule 28.07.2011