Форматирование строки С#

Мне любопытно, почему я должен использовать форматирование строк, пока я могу использовать конкатенацию, такую ​​как

Console.WriteLine("Hello {0} !", name);

Console.WriteLine("Hello "+ name + " !");

Зачем предпочитать первый за секунду?

Ответ 1

Вы выбрали слишком простой пример.

Форматирование строк:

  • позволяет использовать одну и ту же переменную несколько раз: ("{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 <"

Ответ 2

Вы можете обменять строку для динамической строки позже.

Например:

// 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}", и вам не нужно менять какой-либо другой код. С конкатенацией вам нужно будет отредактировать код или, возможно, дублировать свой код для обработки обоих случаев.

Это полезно для локализации/интернационализации.

Ответ 3

Не существует однозначного правильного ответа на этот вопрос. Есть несколько вопросов, которые вы хотите решить:

Производительность

Различия в производительности ваших примеров (и в реальных приложениях) минимальны. Если вы начнете писать 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);

Заключение

Я бы выбрал форматированную строку большую часть времени... Но я бы не стал колебаться вообще, чтобы использовать конкатенацию, когда было легче.

Ответ 5

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

string greeting = "Hello {0}!";
Console.WriteLine(greeting, name);

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

Ответ 6

Я думаю, что хорошим примером является i18n и l10n

Если вам нужно изменить строку между разными языками, это: "bla" + variable + "bla bla.." Будет выдавать проблемы для программы, используемой для создания sobstitution для ваших строк, если вы используете другой язык

в то время как таким образом: "bla {0} blabla" легко конвертируется (вы получите {0} как часть строки)

Ответ 7

Форматирование обычно предпочтительнее для большинства причин, объясненных другими участниками здесь. Есть еще несколько причин, по которым я хочу отказаться от моего короткого опыта программирования:

  • Форматирование поможет в создании строк, относящихся к культуре.
  • Форматирование более совершенное, чем конкатенация. Помните, что каждая операция конкатенации будет включать создание временных промежуточных строк. Если у вас есть куча строк, вам нужно конкатенировать, вам лучше использовать String.Join или StringBuilder.

Ответ 8

Вы используете тривиальный пример, в котором нет большой разницы. Однако, если у вас длинная строка со многими параметрами, гораздо удобнее использовать строку формата вместо многих, многих + знаков и разрывов строк.

Он также позволяет вам форматировать числовые данные по вашему желанию, то есть валюту, даты и т.д.

Ответ 9

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

например.

string displayInHex = String.Format("{0,10:X}", value); // to display in hex

Он также более последователен. Вы можете использовать одно и то же соглашение для отображения своего оператора Debug. например.

Debug.WriteLine (String.Format("{0,10:X}", value));

И последнее, но не менее важное: это помогает в локализации вашей программы.

Ответ 10

В дополнение к таким причинам, как 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 + ".";

Ответ 11

Я нашел прежний подход (используя 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 делает все это более читабельным и поддерживаемым.

Я предполагаю, что короткий ответ, который я даю, не так - читаемость и ремонтопригодность для длинных или сложных строк.

Ответ 12

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

Примечание:

С помощью строковой интерполяции С# 6 ваш код может быть упрощен:

Console.WriteLine($"Hello {name}!");

Что я думаю лучше, чем ваши две предложенные варианты.

Ответ 13

Так как С# 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