String.Format против «строки» + «строки» или StringBuilder?[дубликат]
-
06-09-2019 - |
Вопрос
Возможные дубликаты:
Является ли 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 должно быть быстрее.
РЕДАКТИРОВАТЬ:Конечно, использование оператора «+» — худший вариант, поскольку он создает новый экземпляр строки для каждой объединяемой строки.