Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

Для более сложных строк, имеющих определенный формат и где полезно сохранить структуру всей строки и предоставить заполнитель для ввода, используйте 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).Это все еще тривиальный пример, но вы поняли идею.

Другие советы

Я также склонен использовать 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);

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

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


Разъяснение

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

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


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

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

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

Мое правило: если мне придется использовать + (объединение) более одного раза я меняю его на 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

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

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

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

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

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

"You have {0} widgets.".Frmt(widgetCount)
"You have " + widgetCount.ToString() + " widgets."
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top