Мне любопытно, почему я использовал бы строковое форматирование, в то время как я могу использовать конкатенацию такой как
Console.WriteLine("Hello {0} !", name);
Console.WriteLine("Hello "+ name + " !");
Почему предпочесть первый по второму?
Вы выбрали слишком простой пример.
Форматирование строки:
("{0} + {0} = {1}", x, 2 * x)
] ToString
аргументов: ("{0}: {1}", someKeyObj, someValueObj)
("Значение будет {0: 3N} (или {1: P}) на {2: MMMM yyyy gg} ", x, y, theDate)
("> {0,3} <"," привет "); // "> привет <"
Это зависит: http://geekswithblogs.net/BlackRabbitCoder/archive/2010/05/10/c-string-compares-and-concatenations.aspx
На этот вопрос нет единственно правильного ответа. Есть несколько проблем, которые вы хотите решить:
Производительность
Различия в производительности в ваших примерах (и в реальных приложениях) минимальны. Если вы начнете писать МНОГИЕ конкатенации, вы постепенно увидите лучшую производительность памяти с форматированной строкой. Обратитесь к Ответ Бена
Удобочитаемость
Вам будет лучше с форматированной строкой, если у вас есть форматирование или много разных переменных для строкового преобразования:
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);
Заключение
Я бы выбрал форматированную строку в большинстве случаев ... Но я бы без колебаний использовал конкатенацию, когда это было проще.
Позже вы можете обменять строку на динамическую.
Например:
// 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}"
, и вам не нужно менять какой-либо другой код. При объединении вам потребуется отредактировать код или, возможно, продублировать код для обработки обоих случаев.
Это полезно при локализации / интернационализации.
Форматирование строк позволяет хранить строку формата отдельно и использовать ее там, где это необходимо, не беспокоясь о конкатенации.
string greeting = "Hello {0}!";
Console.WriteLine(greeting, name);
Что касается того, почему вы используете его именно в том примере, который вы привели... сила привычки, на самом деле.
Я думаю, что хороший пример касается i18n и l10n
Если вам нужно изменить строку между разными языками, это: «bla» + переменная + «bla bla ..» Если вы используете другой язык
, возникнут проблемы для программы, используемой для создания структуры строк
, в то время как таким образом: "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));
И последнее, но не менее важное: это помогает в локализации вашей программы.
В дополнение к причинам, как у Игнасио, многие (включая меня) считают, что код на основе 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 делает все это немного более читаемым и удобным.
Думаю, это и есть мой короткий ответ - читабельность и удобство обслуживания для длинных или сложных строк.
Форматирование обычно предпочтительнее по большинству причин, объясненных здесь другими участниками. Из своего короткого опыта программирования я хотел бы выделить еще пару причин: