Чи є помітна різниця в продуктивності між використанням інтерполяції рядків:
myString += $"{x:x2}";
vs String.Format ()?
myString += String.Format("{0:x2}", x);
Я прошу лише тому, що Resharper спонукає до виправлення, і мене раніше обдурили.
Чи є помітна різниця в продуктивності між використанням інтерполяції рядків:
myString += $"{x:x2}";
vs 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 ви можете вказати кілька результатів для одного аргументу, і різні формати виводу для одного аргументу. Але здається, що строкова інтерполяція є більш читаною. Отже, це залежить від вас.
a = string.Format("Due date is {0:M/d/yy} at {0:h:mm}", someComplexObject.someObject.someProperty);
b = $"Due date is {someComplexObject.someObject.someProperty:M/d/yy} at {someComplexObject.someObject.someProperty:h:mm}";
Є деякі результати тесту на продуктивність https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a
String::Format
. а іноді і в String::Concat
. І тест ефективності на цій сторінці не дуже важливий: кількість аргументів, які ви передаєте кожному з цих методів, залежить. concat не завжди найшвидший, струнобудівник не завжди найповільніший.
Питання стосувалося продуктивності, проте в заголовку просто сказано "проти", тому мені здається, що потрібно додати ще декілька балів, хоча деякі з них впевнені.
Локалізація
string.Format
. Однак для цього є інструменти (наприклад ReSharper
).Технічне обслуговування (на мою думку)
string.Format
набагато легше для читання, оскільки фокусується на реченні те, що я хотів би викласти, наприклад, коли будується приємне та змістовне повідомлення про помилку. Використання {N}
заповнювачів надає мені більшої гнучкості, і її простіше змінити пізніше.string.Format
набагато менш схильний до цього.Тож на основі цього я вирішив дотримуватися string.Format
більшості свого коду. Однак я підготував метод розширення, щоб мати більш плавний спосіб кодування, який мені подобається набагато більше. Реалізація розширення є однолінійною, і це виглядає просто так у використанні.
var myErrorMessage = "Value must be less than {0:0.00} for field {1}".FormatWith(maximum, fieldName);
Інтерполяція - чудова особливість, не зрозумійте мене неправильно. Але IMO він найкраще висвітлює ті мови, які пропускають string.Format
подібну функцію, наприклад, JavaScript.
{3}
є X чи Y, особливо якщо ви починаєте перебудовувати свій формат. Приклад Madlibs: $"It was a {adjective} day in {month} when I {didSomething}"
vs string.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
Я думаю , ви набагато менш схильні до цього питання. Але все одно, саме тому я підкреслив, що це моя думка :)