Зачем использовать String.Format?

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

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

вопрос задан 12.01.2011
Mathias Lykkegaard Lorenzen
6348 репутация

7 ответов


  • 370 рейтинг

    Я вижу ряд причин:

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

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

    против:

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

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

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

    против:

    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.
    

    против:

    _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.
    
    ответ дан Moo-Juice, с репутацией 31537, 12.01.2011
  • 84 рейтинг

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

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

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

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

    Русский: "{0} blet blet {2} blet {1}"

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

    ответ дан doobop, с репутацией 3331, 12.01.2011
  • 26 рейтинг

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

    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 и избегает Schlemiel the Painter .

    ответ дан jason, с репутацией 190242, 12.01.2011
  • 16 рейтинг

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

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

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

    ответ дан Joel Coehoorn, с репутацией 299287, 12.01.2011
  • 5 рейтинг

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

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

    ответ дан Reed Copsey, с репутацией 458691, 12.01.2011
  • 4 рейтинг

    В этом вопросе есть интересный материал

    Однако я лично все равно рекомендовал бы string.Format, если производительность не критична для удобства чтения.

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

    более читабельно, чем

    key + ": " + value
    

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

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

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

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

    ответ дан SamStephens, с репутацией 4905, 12.01.2011
  • 2 рейтинг

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

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

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

    , где

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

    ответ дан user2186941, с репутацией 21, 19.03.2013