Мне любопытно, почему я должен использовать форматирование строк, пока я могу использовать конкатенацию, такую как
Console.WriteLine("Hello {0} !", name);
Console.WriteLine("Hello "+ name + " !");
Зачем предпочитать первый за секунду?
Мне любопытно, почему я должен использовать форматирование строк, пока я могу использовать конкатенацию, такую как
Console.WriteLine("Hello {0} !", name);
Console.WriteLine("Hello "+ name + " !");
Зачем предпочитать первый за секунду?
Вы выбрали слишком простой пример.
Форматирование строк:
("{0} + {0} = {1}", x, 2*x)
ToString
по своим аргументам: ("{0}: {1}", someKeyObj, someValueObj)
("The value will be {0:3N} (or {1:P}) on {2:MMMM yyyy gg}", x, y, theDate)
(">{0,3}<", "hi"); // ">hi <"
Вы можете обменять строку для динамической строки позже.
Например:
// In a land far, far away
string nameFormat = "{0} {1}";
// In our function
string firstName = "John";
string lastName = "Doe";
Console.WriteLine(nameFormat, firstName, lastName);
Здесь вы можете изменить nameFormat
на, например. "{1}, {0}"
, и вам не нужно менять какой-либо другой код. С конкатенацией вам нужно будет отредактировать код или, возможно, дублировать свой код для обработки обоих случаев.
Это полезно для локализации/интернационализации.
Не существует однозначного правильного ответа на этот вопрос. Есть несколько вопросов, которые вы хотите решить:
Производительность
Различия в производительности ваших примеров (и в реальных приложениях) минимальны. Если вы начнете писать MANY-конкатенации, вы постепенно увидите лучшую производительность памяти с форматированной строкой. Обратитесь к ответ Бен
читаемость
Вам будет лучше с форматированной строкой, если у вас есть форматирование, или у вас есть много разных переменных:
string formatString = "Hello {0}, today is {1:yyyy-MM-dd}";
Console.WriteLine(formatString, userName, Date.Today);
расширяемость
Ваша ситуация определит, что лучше всего. Вы говорите мне, что лучше, когда вам нужно добавить элемент между именем пользователя и временем в журнале:
Console.WriteLine(
@"Error!
Username: " + userName + "
Time: " + time.ToString("HH:mm:ss") + "
Function: " + functionName + "
Action: " + actionName + "
status: " + status + "
---");
или
Console.WriteLine(@"Error!
Username: {0}
Time: {1}
Function: {2}
Action: {3}
status: {4}
---",
username, time.ToString("HH:mm:ss"), functionName, actionName, status);
Заключение
Я бы выбрал форматированную строку большую часть времени... Но я бы не стал колебаться вообще, чтобы использовать конкатенацию, когда было легче.
Это зависит: http://geekswithblogs.net/BlackRabbitCoder/archive/2010/05/10/c-string-compares-and-concatenations.aspx
Форматирование строк позволяет сохранить строку формата отдельно и использовать ее там, где она необходима, без необходимости беспокоиться о конкатенации.
string greeting = "Hello {0}!";
Console.WriteLine(greeting, name);
Что касается того, почему вы использовали бы его в точном примере, который вы дали... сила привычки, действительно.
Я думаю, что хорошим примером является i18n и l10n
Если вам нужно изменить строку между разными языками, это: "bla" + variable + "bla bla.." Будет выдавать проблемы для программы, используемой для создания sobstitution для ваших строк, если вы используете другой язык
в то время как таким образом: "bla {0} blabla" легко конвертируется (вы получите {0} как часть строки)
Форматирование обычно предпочтительнее для большинства причин, объясненных другими участниками здесь. Есть еще несколько причин, по которым я хочу отказаться от моего короткого опыта программирования:
Вы используете тривиальный пример, в котором нет большой разницы. Однако, если у вас длинная строка со многими параметрами, гораздо удобнее использовать строку формата вместо многих, многих + знаков и разрывов строк.
Он также позволяет вам форматировать числовые данные по вашему желанию, то есть валюту, даты и т.д.
Рекомендуется использовать первый формат. Он позволяет вам указать конкретные форматы для других типов, например, отобразить шестнадцатеричное значение или отобразить определенный формат строки.
например.
string displayInHex = String.Format("{0,10:X}", value); // to display in hex
Он также более последователен. Вы можете использовать одно и то же соглашение для отображения своего оператора Debug. например.
Debug.WriteLine (String.Format("{0,10:X}", value));
И последнее, но не менее важное: это помогает в локализации вашей программы.
В дополнение к таким причинам, как Ignacio, многие (включая меня) находят String.Format
-ограниченный код намного легче читать и изменять.
string x = String.Format(
"This file was last modified on {0} at {1} by {2}, and was last backed up {3}."
date, time, user, backupDate);
против.
string x = "This file was last modified on " + date + " at "
+ time + " by " + user + " and was last backed up " + backupDate + ".";
Я нашел прежний подход (используя string.format) очень полезным при переопределении методов ToString() в классах Entity.
Например, в моем классе Product;
public override string ToString()
{
return string.format("{0} : {1} ({2} / {3} / {4}",
this.id,
this.description,
this.brand,
this.model);
}
Затем, когда пользователи решают, что они хотят, чтобы продукт выглядел по-разному, легко изменить порядок/содержимое или макет строки, которая возвращается.
Конечно, вы все еще объединяете эту строку вместе, но я чувствую string.Format делает все это более читабельным и поддерживаемым.
Я предполагаю, что короткий ответ, который я даю, не так - читаемость и ремонтопригодность для длинных или сложных строк.
Я думаю, что главное здесь удобочитаемость. Поэтому я всегда выбираю, для чего лучше всего читаем для каждого случая.
С помощью строковой интерполяции С# 6 ваш код может быть упрощен:
Console.WriteLine($"Hello {name}!");
Что я думаю лучше, чем ваши две предложенные варианты.
Так как С# 6 выпущен несколько лет назад, также можно выполнить интерполяцию строк. Например:
var n = 12.5847;
System.Console.WriteLine(string.Format("Hello World! {0:C2}", n));
Становится следующим:
var n = 12.5847;
System.Console.WriteLine($"Hello World! {n:C2}");
И оба дают вам этот результат:
Hello World! £12.58