Есть ли заметная разница в производительности между использованием интерполяции строк:
myString += $"{x:x2}";
против String.Format ()?
myString += String.Format("{0:x2}", x);
Я спрашиваю только потому, что Resharper предлагает исправить, а меня раньше обманывали.
Ответы:
Заметное относительное. Однако: строковая интерполяция включается во время
string.Format()
компиляции, поэтому они должны иметь тот же результат.Однако есть тонкие различия: как мы можем понять из этого вопроса, конкатенация строк в спецификаторе формата приводит к дополнительному
string.Concat()
вызову.источник
int
используется a ).var a = "hello"; var b = $"{a} world";
компилируется в конкатенацию строк.var a = "hello"; var b = $"{a} world {1}";
компилируется в строковый формат.строковая интерполяция превращается в string.Format () во время компиляции.
Также в string.Format вы можете указать несколько выходных данных для одного аргумента и разные форматы вывода для одного аргумента. Но я думаю, строковая интерполяция более читабельна. Так что решать вам.
Есть некоторые результаты теста производительности https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a
источник
String::Format
. а иногда и вString::Concat
. И тест производительности на этой странице, imho, на самом деле не имеет смысла: количество аргументов, которые вы передаете каждому из этих методов, зависит от него. concat не всегда самый быстрый, построитель строк не всегда самый медленный.Вопрос касался производительности, однако в названии просто написано «против», поэтому я чувствую, что нужно добавить еще несколько пунктов, хотя некоторые из них являются самоуверенными.
Локализация
string.Format
. Однако для этого есть инструменты (напримерReSharper
).Ремонтопригодность (мое мнение)
string.Format
гораздо более читабелен, поскольку он фокусируется на предложении, которое я хотел бы сформулировать, например, при создании красивого и значимого сообщения об ошибке. Использование{N}
заполнителей дает мне больше гибкости, и ее легче изменить позже.string.Format
гораздо менее подвержен этому.Исходя из этого, я решил придерживаться
string.Format
большей части своего кода. Однако я подготовил метод расширения, чтобы иметь более плавный способ кодирования, который мне нравится больше. Реализация расширения однострочная, и при использовании она выглядит просто так.Не поймите меня неправильно, интерполяция - отличная функция. Но IMO он лучше всего проявляет на тех языках, в которых отсутствует
string.Format
-подобная функция, например JavaScript.источник
{3}
X или Y, особенно если вы начнете перестраивать свой формат. Пример Madlibs:$"It was a {adjective} day in {month} when I {didSomething}"
vsstring.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)
->$"I {didSomething} on a {adjective} {month} day"
vsstring.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
string.Format
Я думаю , вы гораздо менее склонны к этому вопросу. Но в любом случае именно поэтому я подчеркнул, что это мое мнение :)