ToString
использование
Нет, вы не должны использовать ToString
здесь.
Конкатенация строк автоматически преобразует не-строки в строки, что означает, что ваши два варианта почти идентичны:
Когда один или оба операнда имеют тип string, предопределенные операторы сложения объединяют строковое представление операндов.
Источник: C # Спецификация языка: оператор сложения, MSDN .
С другой стороны, первый (без ToString
):
- Короче, чтобы написать,
- Короче читать,
- Проще поддерживать и:
- точно показывает намерение автора: объединить строки.
Поэтому предпочитаю первый.
Под капотом
Также интересно посмотреть, что происходит под капотом. Один из способов увидеть это - посмотреть IL-код в LINQPad. Эта программа:
void Main()
{
var a = 3;
var b = " Hello";
var c = a + b;
Console.WriteLine(c);
}
переводится на следующий IL:
IL_0001: ldc.i4.3
IL_0002: stloc.0 // a
IL_0003: ldstr " Hello"
IL_0008: stloc.1 // b
IL_0009: ldloc.0 // a
IL_000A: box System.Int32
IL_000F: ldloc.1 // b
IL_0010: call System.String.Concat
IL_0015: stloc.2 // c
IL_0016: ldloc.2 // c
IL_0017: call System.Console.WriteLine
Видишь это System.String.Concat
? Это означает, что оригинальный код может быть написан так же, как и тот, который переводится в точно такой же IL:
void Main()
{
var a = 3;
var b = " Hello";
var c = string.Concat(a, b); // This is the line which was changed.
Console.WriteLine(c);
}
Когда вы читаете документациюstring.Concat(object[])
, вы можете узнать, что:
Метод объединяет каждый объект в аргументах , вызывая ToString
метод без параметров этого объекта; он не добавляет разделителей.
Это означает, что ToString
это избыточно. Также:
String.Empty
используется вместо любого нулевого объекта в массиве.
Что прекрасно подходит для случая, когда некоторые из операндов равны нулю (см. Сноску 1).
Хотя в последнем примере конкатенация была переведена в string.Concat
, следует также выделить оптимизации компилятора:
var a = "Hello " + "World";
переводится на:
ldstr "Hello World"
stloc.0
С другой стороны:
var a = string.Concat("Hello ", "World");
переводится на:
ldstr "Hello "
ldstr "World"
call System.String.Concat
stloc.0
Другие альтернативы
Есть, конечно, и другие способы объединения строковых представлений объектов в C #.
StringBuilder
используется, когда вам нужно выполнить много операций конкатенации, и помогает уменьшить количество создаваемых промежуточных строк. Решить, использовать ли вам StringBuilder
обычную или обычную конкатенацию, может быть непросто. Используйте профилировщик или найдите соответствующие ответы в переполнении стека.
Использование StringBuilder
имеет существенный недостаток, заключающийся в затруднении чтения и обслуживания кода. Для простых случаев, как тот, что в вашем вопросе, StringBuilder
это не только вредно для читабельности кода, но и бесполезно с точки зрения производительности.
string.Join
следует использовать, когда вам нужно добавить разделители.
Очевидно, никогда не используйте string.Join
с пустым разделителем для объединения строк.
string.Format
может использоваться, когда шаблонирование строк предпочтительнее объединения строк. Один из случаев, когда вы можете предпочесть, это когда сообщение может быть локализовано, как это предлагается в ответе Кунтхет.
Использование string.Format
имеет несколько недостатков, что делает его непригодным для простых случаев, таких как ваш:
При использовании простых заполнителей "{0}" часто неясно, какой параметр и куда идет. Часто ошибочно меняют параметры или забывают один. К счастью, C # 6 наконец вводит интерполяцию строк, которая решает эту проблему.
Производительность во время выполнения может ухудшиться. Конечно, не думайте, string.Format
что всегда медленнее. Если производительность имеет значение, измерьте два подхода и определите, какой из них быстрее, основываясь на ваших реальных результатах, а не на предположениях.
Код немного длиннее для написания, длиннее для чтения и сложнее в обслуживании, хотя это крайне незначительно и не должно вас сильно беспокоить.
¹ Разница появляется, когда один из объектов null
. Без ToString
, а null
заменяется пустой строкой. С ToString
, NullReferenceException
брошено.
a + "" + b + ""
или"" + a + b + ""
, это не имеет значения: все это конкатенация строк. Вa + b + ""
этом имеет значение:a
иb
добавляются первыми.