Есть ли преимущества в использовании форматирования строк по сравнению с конкатенацией строк?

Возможный дубликат:
Вывод строки C #: формат или объединение ?

в чем польза от использования этого:

Console.WriteLine("{0}: {1}", e.Code, e.Reason);

ПРОТИВ. это:

Console.WriteLine(e.Code + ": " + e.Reason);

????


person capdragon    schedule 25.01.2011    source источник
comment
Вы можете посмотреть дизассемблированный код, чтобы увидеть, есть ли существенная разница в производительности. Лично я предпочитаю первый.   -  person fardjad    schedule 26.01.2011
comment
Меня постоянно шокируют люди, которые находят спецификаторы формата более удобочитаемыми, чем простые конкатенации. Не говорите мне, что вы никогда не ошибались при вводе и вам пришлось вернуться и исправить ошибку из-за этого. Также см. эту запись в блоге . Как оказалось, простая конкатенация (+) лучше всего подходит для конкатенации (достаточно небольшие наборы), StringBuilder лучше всего, когда вам нужно построить цикл, а Format лучше всего при форматировании. Прирост производительности от использования Format по сравнению с + в лучшем случае незначителен.   -  person Cody Gray    schedule 26.01.2011


Ответы (5)


Для меня преимущества подвески string.Format:

  • Улучшенная читаемость
  • Лучше переводимый

С точки зрения производительности я никогда не проводил никаких измерений; вполне может быть, что объединение происходит быстрее, чем кулон string.Format.

person Uwe Keim    schedule 25.01.2011

Я всегда использую .Format () для удобочитаемости и, как следствие, уменьшения количества ошибок и преимуществ обслуживания. Конечно, это не имеет смысла, если вы относительно новичок в программировании, поскольку второй пример поначалу более интуитивно понятен. Первое кажется излишне сложным.

Однако, если вы выберете второй шаблон, у вас начнутся проблемы, когда у вас будет много переменных. Здесь легче оценить преимущества первого шаблона.

e.g

Console.Writeline(var1 + " " + var2 + "-" + var3 +
 " some sort of additional text" + var4);

Обратите внимание на ошибку: мне нужен еще один пробел после «текста», но в этом примере это нелегко увидеть.

Однако, если я сделаю это по-другому:

Console.Writeline("{0} {1}-{2} some sort of additional text{3}", 
 var1, var2, var3, var4)

Понятнее, что происходит. Легче оценить конечный результат, если вы отделите форматирование от переменных, которые будут использоваться.

Если мы хотим думать еще дальше в долгосрочной перспективе, это помогает с глобализацией / настройкой. Если мы поместим эти строки формата в конфигурацию, мы сможем изменить форматирование или порядок переменных, не касаясь кода.

person Quibblesome    schedule 25.01.2011

Практически с той лишь разницей, что первая позволяет управлять макетом.

string.Format("*{0:3}*",1); // *  1*

или управлять форматированием:

string.Format("*{0:c}*",1); // *$1.00*

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

person Community    schedule 25.01.2011
comment
Макет может быть выполнен с помощью многочисленных перегрузок ToString, часто принимающих шаблон - person Marc Gravell; 26.01.2011
comment
@Marc Но по его примеру ... - person ; 26.01.2011

Это сводится к следующему: «Когда лучше использовать String.Format или объединение строк».

См. Ответ на этот вопрос: Когда это лучше использовать String.Format против конкатенации строк?

person Stefan Steiger    schedule 26.01.2011

Поскольку строки неизменяемы (невозможно изменить существующую строку, необходимо каждый раз создавать новую) строковый формат может иметь преимущества в производительности, поскольку он не создает столько ссылок на память.

result = string1 + " " + string2 + " " + string3

Это создает 10 ссылок

  • результат
  • строка1
  • строка2
  • строка3
  • " "
  • " "
  • строка1 + ""
  • строка1 + "" + строка2
  • строка1 + "" + строка2 + ""
  • строка1 + "" + строка2 + "" + строка 3

result = string.Format("{0} {1} {2}", string1, string2, string3)

Это создает 5 ссылок

  • результат
  • строка1
  • строка2
  • строка3
  • "{0} {1} {2}"
person Jason    schedule 25.01.2011
comment
Первое просто неверно; это один вызов string.Concat, который измеряет все строки, предварительно выделяет правильное пространство и копирует их. Никаких промежуточных строк. - person Marc Gravell; 26.01.2011