17

Возможные Дубликаты:
Is String.Format as efficient as StringBuilder
C# String output: format or concat?String.Format vs "string" + "string" или StringBuilder?

Что является приоритетом деятельности и каковы должны быть условия, предпочитающих каждый из следующих действий:

String.Format("{0}, {1}", city, state); 

или

city + ", " + state; 

или

StringBuilder sb = new StringBuilder(); 
sb.Append(city); 
sb.Append(", "); 
sb.Append(state); 
sb.ToString(); 
+2

@Shimmy: Посмотрите на это http://stackoverflow.com/questions/6785/is-string-format-as-efficient-as-stringbuilder – shahkalpesh

+0

HTTP: //blogs.msdn.com/b/ricom/archive/2004/03/12/performance-quiz-1-of-a-series.aspx – Freelancer

+1

http://www.codinghorror.com/blog/archives/001218.html – Freelancer

ответ

18
  • Компилятор оптимизирует как можно больше строк, так что, например, строки, которые просто разбиты на разрывы строк, обычно можно оптимизировать в один строковый литерал.
  • конкатенации с переменными будет компилируется в String.Concat
  • StringBuilder может быть намного быстрее, если вы делаете несколько (более чем 10 или так я думаю) «модификации» в строку, но он несет дополнительные накладные расходы, потому что он выделяет больше места, чем вам нужно в своем буфере, и изменяет его внутренний буфер, когда это необходимо.

Я лично использую String.Format почти все время по двум причинам:

  • Это намного проще поддерживать формат строки, чем переставляя кучу переменных.
  • String.Format принимает IFormatProvider, который передается любым типам IFormattable, встроенным в строку (например, числовые), так что вы получаете соответствующее числовое форматирование для указанной культуры и общее простое управление тем, как форматируются значения.

Например, поскольку в некоторых культурах использовать запятую в качестве десятичного вы хотели бы обеспечить либо StringBuilder или String.Format, что вы указываете CultureInfo.InvariantCulture, если вы хотите, чтобы убедиться, что номера были отформатированы так, как вы собираетесь ,

Еще две вещей, чтобы отметить ...

  • StringBuilder также имеет функцию AppendFormat, которая дает вам гибкость String.Format, не требуя ненужный второй буфер.
  • При использовании StringBuilder убедитесь, что вы не победите цель, объединив параметры, которые вы передаете в Append. Легко пропустить.
1

Там нет соответствующего различию. Но предполагая, что String.Format внутренне использует StringBuilder (вы можете видеть это с помощью инструмента Reflector), используя напрямую StringBuilder.Append должен быть быстрее.

EDIT: Конечно, использование оператора «+» является худшим вариантом, поскольку он создает новый экземпляр строки для каждой строки, которую вы объединяете.

+0

Неправильно, в соответствии со ссылкой я написал ниже, кажется, что + является лучшим способом – Shimmy

+1

@shimmy, В этой ссылке нет StringBuilder. Кроме того, в этом тесте вы объединяете только 3 строки, количество строк сильно влияет на производительность. –

+0

Редактирование неверно. Компилятор C# собирает строки или объекты в массив, а затем вызывает String.Concat(). Я ожидал бы, что String.Concat (string []) будет наиболее эффективным, поскольку реализация может выделить строку точно такой же длины. –

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