ToString
використання
Ні, ви не повинні використовувати ToString
тут.
З'єднання рядків автоматично перетворює не рядки в рядки, це означає, що два ваші варіанти майже однакові:
Коли один або обидва операнди мають рядковий тип, попередньо визначені оператори додавання об'єднують рядкове представлення операндів.
Джерело: Специфікація мови C #: Оператор додавання, MSDN .
З іншого боку, перший (без ToString
):
- Коротше писати,
- Коротше читати,
- Простіше в обслуговуванні та:
- показує саме намір автора: об'єднати рядки.
Тому віддайте перевагу першому.
Під капотом
Що також цікаво - подивитися, що відбувається під капотом. Один із способів бачити це - дивитися IL-код в межах LINQPad. Ця програма:
void Main()
{
var a = 3;
var b = " Hello";
var c = a + b;
Console.WriteLine(c);
}
перекладається на наступну ІЛ:
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
a null
замінюється порожнім рядком. З ToString
, NullReferenceException
кидається.
a + "" + b + ""
або"" + a + b + ""
, не має значення: це все об'єднання рядків. Уa + b + ""
цьому має значення:a
іb
додаються першими.