Вопрос

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

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

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

или

city + ", " + state;

или

StringBuilder sb = new StringBuilder();
sb.Append(city);
sb.Append(", ");
sb.Append(state);
sb.ToString();
Это было полезно?

Решение

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

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

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

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

Еще две вещи, на которые стоит обратить внимание...

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

Другие советы

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

РЕДАКТИРОВАТЬ:Конечно, использование оператора «+» — худший вариант, поскольку он создает новый экземпляр строки для каждой объединяемой строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top