Зачем использовать строку.Формат? [дубликат]


этот вопрос уже есть ответ здесь:

  • Вывод строки: формат или конкат в C#? 31 ответы

зачем кому-то использовать String.Format В C# и VB .NET в отличие от операторов конкатенации (& в VB, и + в C#)?

В чем основное отличие? Почему все так заинтересованы в использовании String.Format? Я очень любопытно.

7 157

7 ответов:

Я вижу несколько причин:

читабельности

string s = string.Format("Hey, {0} it is the {1}st day of {2}.  I feel {3}!", _name, _day, _month, _feeling);

vs:

string s = "Hey," + _name + " it is the " + _day + "st day of " + _month + ".  I feel " + feeling + "!";

Спецификаторы Формата (и это включает в себя тот факт, что вы можете писать пользовательские форматеры)

string s = string.Format("Invoice number: {0:0000}", _invoiceNum);

vs:

string s = "Invoice Number = " + ("0000" + _invoiceNum).Substr(..... /*can't even be bothered to type it*/)

Сохранение Шаблона Строки

что если я хочу хранить шаблоны строк в базе данных? С форматированием строки:

_id         _translation
  1         Welcome {0} to {1}.  Today is {2}.
  2         You have {0} products in your basket.
  3         Thank-you for your order.  Your {0} will arrive in {1} working days.

vs:

_id         _translation
  1         Welcome
  2         to
  3         .  Today is
  4         . 
  5         You have
  6         products in your basket.
  7         Someone
  8         just shoot
  9         the developer.

помимо того, что немного легче читать и добавив несколько операторов, это также полезно, если ваше приложение интернационализируется. Много раз переменные-это числа или ключевые слова, которые будут в другом порядке для разных языков. С помощью строки.Формат, ваш код может оставаться неизменным, в то время как различные строки будут идти в файлы ресурсов. Таким образом, код в конечном итоге будет

String.Format(resource.GetString("MyResourceString"), str1, str2, str3);

в то время как ваши строки ресурсов в конечном итоге

английский: "бла-бла {0} бла-бла {1} бла {2}"

русский: "{0} блет блет блет {2} блет {1}"

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

во-первых, я нахожу

string s = String.Format(
    "Your order {0} will be delivered on {1:yyyy-MM-dd}. Your total cost is {2:C}.",
    orderNumber,
    orderDeliveryDate,
    orderCost
);

гораздо проще читать, писать и поддерживать, чем

string s = "Your order " +
           orderNumber.ToString() +
           " will be delivered on " +
           orderDeliveryDate.ToString("yyyy-MM-dd") +
           "." +
           "Your total cost is " +
           orderCost.ToString("C") + 
           ".";

посмотрите, насколько более ремонтопригодны следующие

string s = String.Format(
    "Year = {0:yyyy}, Month = {0:MM}, Day = {0:dd}",
    date
);

над альтернативой, где вам придется повторить date три раза.

во-вторых, спецификаторы формата, что String.Format обеспечивает дает вам большую гибкость над выходом строки таким образом, что легче читать, писать и поддерживать, чем просто с помощью простой старой конкатенации. Кроме того, легче получить культурные проблемы прямо с String.Format.

в-третьих, когда производительность имеет значение, String.Format превзойдет конкатенацию. За кулисами он использует StringBuilder и избегает проблема художника Шлемиля.

нескольким причинам:

  1. строку.Формат () очень мощный. Вы можете использовать простые индикаторы формата (например, фиксированную ширину, валюту, длину символов и т. д.) Прямо в строке формата. Вы даже можете создать свои собственные поставщики форматов для таких вещей, как расширение перечислений, сопоставление конкретных входов с гораздо более сложными выходами или локализация.
  2. вы можете сделать некоторые мощные вещи, поставив строки формата в файлы конфигурации.
  3. строку.Формат() часто быстрее, поскольку он использует StringBuilder и эффективный конечный автомат за кулисами, тогда как конкатенация строк в .Net относительно медленная. Для небольших строк разница незначительна, но она может быть заметна по мере увеличения размера строки и количества подставляемых значений.
  4. строку.Формат() на самом деле более знаком многим программистам, особенно тем, кто исходит из фонов, которые используют варианты старого C .

наконец, не забудь StringBuilder.AppendFormat(). Строка.Format () фактически использует этот метод за кулисами, и переход к StringBuilder напрямую может дать вам своего рода гибридный подход: явно использовать .Добавьте () (аналогично конкатенации) для некоторых частей большой строки и используйте .AppendFormat() в других.

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

для получения подробной информации о том, что возможно, я бы рекомендовал прочитать раздел на MSDN под названием Составное Форматирование. Это объясняет преимущество строки.Форматирование (а также xxx.WriteLine и другие методы, поддерживающие составное форматирование) по сравнению с обычными операторами конкатенации.

есть интересные вещи по аспектам производительности в этот вопрос

однако я лично все равно рекомендую string.Format если производительность не является критической по причинам читаемости.

string.Format("{0}: {1}", key, value);

является более читаемым, чем

key + ": " + value

например. Также обеспечивает хорошее разделение проблем. Значит, вы можете иметь

string.Format(GetConfigValue("KeyValueFormat"), key, value);

а затем изменение формата значения ключа с "{0}: {1} " на "{0} - {1} " становится изменением конфигурации а не изменение кода.

string.Format также имеет кучу форматирования, встроенного в него, целые числа, форматирование даты и т. д.

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

например, нам нужно показать следующую ошибку на разных языках:

MessageBox.Show(String.Format(ErrorManager.GetError("PIDV001").Description, proposalvalue.ProposalSource)

здесь

'ErrorCollector.GetError("ERR001").ErrorDescription' возвращает строку типа "Your ID {0} is not valid". Это сообщение должно быть локализовано на многих языках. В этом случае мы не можем использовать + в C#. Мы должны следовать за строкой.формат.