Зачем использовать строку.Формат? [дубликат]
этот вопрос уже есть ответ здесь:
- Вывод строки: формат или конкат в C#? 31 ответы
зачем кому-то использовать String.Format
В C# и VB .NET в отличие от операторов конкатенации (&
в VB, и +
в C#)?
В чем основное отличие? Почему все так заинтересованы в использовании String.Format
? Я очень любопытно.
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
и избегает проблема художника Шлемиля.
нескольким причинам:
- строку.Формат () очень мощный. Вы можете использовать простые индикаторы формата (например, фиксированную ширину, валюту, длину символов и т. д.) Прямо в строке формата. Вы даже можете создать свои собственные поставщики форматов для таких вещей, как расширение перечислений, сопоставление конкретных входов с гораздо более сложными выходами или локализация.
- вы можете сделать некоторые мощные вещи, поставив строки формата в файлы конфигурации.
- строку.Формат() часто быстрее, поскольку он использует StringBuilder и эффективный конечный автомат за кулисами, тогда как конкатенация строк в .Net относительно медленная. Для небольших строк разница незначительна, но она может быть заметна по мере увеличения размера строки и количества подставляемых значений.
- строку.Формат() на самом деле более знаком многим программистам, особенно тем, кто исходит из фонов, которые используют варианты старого 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#. Мы должны следовать за строкой.формат.