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добавляются первыми.