Использование string.Format для простых вещей? - PullRequest
4 голосов
/ 19 марта 2010

В мои первые дни программирования на .Net я использовал string.Format () только для сложных конкатенаций строк, например, для компиляции строк как

Проблема с заказом клиента 234 от 02.02.2002 и идентификатором платежа 55543.

Но теперь я использую string.Format почти для каждой конкатенации строк, которую я должен сделать, также простые, такие как префикс строки с чем-то.

Console.WriteLine(string.Format("\t\t{0}", myString));

Есть ли какие-либо возможные накладные расходы на это? Может быть, я должен использовать обычный оператор + для выполнения этих простых операций?

Каково ваше мнение по этому поводу?

Ответы [ 7 ]

5 голосов
/ 19 марта 2010

Для простых конкатенаций строк используйте подход +. Это понятнее для простых вещей, которые не требуют формата.

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

И да, есть накладные расходы. String.Format использует StringBuilder под крышками. В этих сценариях простые конкатенации строк будут выполняться намного быстрее. Несколько тестов и сообщений в блоге на эту тему можно найти довольно легко. Конечно все зависит от вашего использования. Если в цикле встречаются небольшие строковые конкататы, то повторное использование String.Format, вероятно, будет более заметным, чем прямое + конкат. Если вы строите большую строку в цикле, тогда классическим примером является предпочтение StringBuilder, и связанные вопросы по concat и StringBuilder можно найти в SO.

РЕДАКТИРОВАТЬ: Для пояснения, это служит небольшой цели: String.Format("{0}{1}", a, b), так как форматирование не так много. Это просто a + b. К сожалению, я встречал такие примеры в рабочем коде, и как только я увижу String.Format, я ожидаю увидеть что-то, что должно быть структурировано определенным образом, а не простой конкат.

OTOH, рассмотрите этот номер телефона: "(" + area + ") " + number + " x" + extension - слишком много всего происходит, и изменить его нелегко. В этом случае предпочтительным является String.Format: String.Format("({0}) {1} x{2}", area, number, extension). Это все еще тривиальный пример, но вы поняли идею.

2 голосов
/ 19 марта 2010

Я также склоняюсь к использованию string.Format в большинстве операций, в которых требуется объединить две или более строки / значения, поскольку это облегчает чтение кода, чем запуск и остановка строк с + в середине.

Расширение

string value = string.Format("Hello {0}", user.username);

гораздо более читабельно и расширяемо, чем, например,

string value = "Hello" + user.username

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

string value = string.Format("Hello {0}, you last logged in {1}", user.username, user.lastLogin);
2 голосов
/ 19 марта 2010

Простое объединение более эффективно для простых вещей. Используйте String.Format() для случаев, когда все усложняется, и это облегчает чтение вашего кода.

Лично я делаю то же самое (пока функция, которую я вызываю, не обрабатывает форматирование для меня).

<ч />

Clarrification

Для обычной конкатенации строк, например "Hello " + "World!";, я бы использовал StringBuilder. Ваш пример форматирует строку для вывода, добавляя две вкладки ... которые я считаю более похожими на форматирование.

Существует разница между форматированием и объединением ... будьте осторожны, для чего вы используете.

<ч />

String.Format() использует StringBuilder внутри, поэтому объединение будет более эффективным, чем обычное объединение строк в любом случае.

Возможно, вы захотите изменить свой пример, поскольку Console.WriteLine() может обрабатывать само форматирование (не нужно String.Format()):

Console.WriteLine("\t\t{0}", myString);

1 голос
/ 19 марта 2010

Мое правило: если мне нужно использовать + (объединение) более одного раза, я изменяю его на string.Format.

string a = "Something: " + x;   // ok

string b = "Something: " + x + " something else"; // change it to a string.Format
string bB = string.Format("Something: {0} something else", x); // much nicer to read

string c = "Something: " + x + " " + y + " " + z;  // Yuck
string cC = string.Format("Something: {0} {1} {2}", x, y, x);  // Much nicer
0 голосов
/ 19 марта 2010

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

Честно, что выглядит лучше?

"You have {0} widgets.".Frmt(widgetCount)
"You have " + widgetCount.ToString() + " widgets."
0 голосов
/ 19 марта 2010

Я склонен использовать String.Concat вместо String.Format, когда мне просто нужно добавить префикс или суффикс данной строки. Я предпочитаю явный вызов метода Concat, чтобы использовать оператор +, и, если вы уже используете String.Format, достаточно просто нажать одну клавишу.

IIRC, метод String.Concat будет таким же, как при использовании оператора, поэтому он также будет быстрее, чем String.Format.

0 голосов
/ 19 марта 2010

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

...