Для простого случая, когда это простая одиночная конкатенация, я чувствую, что это не стоит сложностей string.Format
(и я не тестировал, но подозреваю, что для такого простого случая, как этот, string.Format
может быть немного медленнее, что с синтаксическим анализом строки формата и все). Как и Джон Скит, я предпочитаю не вызывать явно .ToString()
, поскольку это будет сделано неявно string.Concat(string, object)
перегрузкой, и я думаю, что код выглядит более чистым и его легче читать без него.
Но я определенно предпочитаю больше, чем несколько конкатенаций (сколько это субъективно) string.Format
. В какой-то момент я думаю, что и удобочитаемость, и производительность излишне страдают от конкатенации.
Если в строке формата много параметров (опять же, «многие» субъективно), я обычно предпочитаю включать в аргументы замены закомментированные индексы, чтобы не упустить из виду, какое значение соответствует какому параметру. Надуманный пример:
Console.WriteLine(
"Dear {0} {1},\n\n" +
"Our records indicate that your {2}, \"{3}\", is due for {4} {5} shots.\n" +
"Please call our office at 1-900-382-5633 to make an appointment.\n\n" +
"Thank you,\n" +
"Eastern Veterinary",
/*0*/client.Title,
/*1*/client.LastName,
/*2*/client.Pet.Animal,
/*3*/client.Pet.Name,
/*4*/client.Pet.Gender == Gender.Male ? "his" : "her",
/*5*/client.Pet.Schedule[0]
);
Обновить
Мне приходит в голову, что приведенный мной пример немного сбивает с толку, потому что, похоже, я использовал как конкатенацию, так и string.Format
здесь. И да, логически и лексически это то, что я сделал. Но все конкатенации будут оптимизированы компилятором 1 , поскольку они все строковые литералы. Таким образом, во время выполнения будет одна строка. Итак, я думаю, я должен сказать, что предпочитаю избегать множества конкатенаций во время выполнения .
Конечно, большая часть этой темы уже устарела, если вы все еще не застряли на C # 5 или старше. Теперь у нас есть интерполированные строки , которые по удобочитаемости намного превосходят их string.Format
почти во всех случаях. В наши дни, если я просто не конкатенирую значение непосредственно в начало или конец строкового литерала, я почти всегда использую интерполяцию строк. Сегодня я бы написал свой предыдущий пример так:
Console.WriteLine(
$"Dear {client.Title} {client.LastName},\n\n" +
$"Our records indicate that your {client.Pet.Animal}, \"{client.Pet.Name}\", " +
$"is due for {(client.Pet.Gender == Gender.Male ? "his" : "her")} " +
$"{client.Pet.Schedule[0]} shots.\n" +
"Please call our office at 1-900-382-5633 to make an appointment.\n\n" +
"Thank you,\n" +
"Eastern Veterinary"
);
Таким образом, вы теряете конкатенацию во время компиляции. Каждая интерполированная строка превращается в вызов string.Format
компилятора, и их результаты объединяются во время выполнения. Это означает, что производительность во время выполнения приносится в жертву удобочитаемости. В большинстве случаев это стоящая жертва, потому что потери времени выполнения незначительны. Однако в критически важном для производительности коде вам может потребоваться профилирование различных решений.
1
Вы можете увидеть это в спецификации C # :
... в постоянных выражениях разрешены следующие конструкции:
...
- Предопределенный бинарный оператор + ...
Вы также можете проверить это с помощью небольшого кода:
const string s =
"This compiles successfully, " +
"and you can see that it will " +
"all be one string (named `s`) " +
"at run time";