строковое форматирование c#

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

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

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

Почему предпочесть первый по второму?

22
задан DarthVader 11 June 2010 в 00:47
поделиться

11 ответов

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

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

  • позволяет использовать одну и ту же переменную несколько раз: ("{0} + {0} = {1}", x, 2 * x)
  • автоматически вызывает ] ToString аргументов: ("{0}: {1}", someKeyObj, someValueObj)
  • позволяет указать форматирование: ("Значение будет {0: 3N} (или {1: P}) на {2: MMMM yyyy gg} ", x, y, theDate)
  • позволяет легко установить отступы: ("> {0,3} <"," привет "); // "> привет <"
61
ответ дан 29 November 2019 в 03:22
поделиться

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

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

Различия в производительности в ваших примерах (и в реальных приложениях) минимальны. Если вы начнете писать МНОГИЕ конкатенации, вы постепенно увидите лучшую производительность памяти с форматированной строкой. Обратитесь к Ответ Бена

Удобочитаемость

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

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);

Заключение

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

6
ответ дан 29 November 2019 в 03:22
поделиться

Позже вы можете обменять строку на динамическую.

Например:

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

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

12
ответ дан 29 November 2019 в 03:22
поделиться

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

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

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

2
ответ дан 29 November 2019 в 03:22
поделиться

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

Если вам нужно изменить строку между разными языками, это: «bla» + переменная + «bla bla ..» Если вы используете другой язык

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

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

2
ответ дан 29 November 2019 в 03:22
поделиться

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

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

1
ответ дан 29 November 2019 в 03:22
поделиться

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

например

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

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

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

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

1
ответ дан 29 November 2019 в 03:22
поделиться

В дополнение к причинам, как у Игнасио, многие (включая меня) считают, что код на основе 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 + ".";
1
ответ дан 29 November 2019 в 03:22
поделиться

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

Думаю, это и есть мой короткий ответ - читабельность и удобство обслуживания для длинных или сложных строк.

1
ответ дан 29 November 2019 в 03:22
поделиться

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

  • Форматирование поможет в создании строк с учетом культуры.
  • Форматирование более производительно, чем объединение. Помните, что каждая операция конкатенации будет включать создание временных промежуточных строк. Если у вас есть набор строк, которые вам нужно объединить, вам лучше использовать String.Join или StringBuilder.
2
ответ дан 29 November 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: