Подтвердить что ты не робот

String.Format vs "string" + "string" или StringBuilder?

Возможные дубликаты:
Является ли String.Format таким же эффективным, как StringBuilder
С# Строковый вывод: формат или concat?

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

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

или

city + ", " + state;

или

StringBuilder sb = new StringBuilder();
sb.Append(city);
sb.Append(", ");
sb.Append(state);
sb.ToString();
4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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