Ответ в том, что это зависит от того, как вы соединяете. Если вы используете оператор + со статическими строками, то ваши друзья правы - вам не нужен строитель строк. Однако если вы используете строковые переменные или оператор + =, то вы перераспределяете строки.
Чтобы действительно выяснить, что здесь происходит, нужно написать некоторый код и затем декомпилировать его.
Давайте создадим некоторый тестовый код и рассмотрим его в Reflector, используя представление IL (или вы можете использовать ILDASM, в зависимости от того, что вы предпочитаете
Итак, во-первых, базовый уровень - этот метод не объединяется вообще:
static void NoConcat()
{
string test = "Hello World";
}
Теперь вот ИЛ:
.method private hidebysig static void NoConcat() cil managed
{
.maxstack 1
.locals init (
[0] string test)
L_0000: nop
L_0001: ldstr "Hello World" <----------NO reallocation!
L_0006: stloc.0
L_0007: ret
}
Хорошо, никаких сюрпризов, верно?
Теперь давайте рассмотрим некоторый код, который определенно перераспределяет строку, поэтому мы знаем, как это выглядит:
static void Concat2()
{
string test = "Hello";
test += " ";
test += "World";
}
Вот IL, обратите внимание на перераспределения (он вызывает string.Concat, который вызывает выделение новой строки):
.method private hidebysig static void Concat2() cil managed
{
.maxstack 2
.locals init (
[0] string test)
L_0000: nop
L_0001: ldstr "Hello"
L_0006: stloc.0
L_0007: ldloc.0
L_0008: ldstr " "
L_000d: call string [mscorlib]System.String::Concat(string, string)
L_0012: stloc.0
L_0013: ldloc.0
L_0014: ldstr "World"
L_0019: call string [mscorlib]System.String::Concat(string, string)
L_001e: stloc.0
L_001f: ret
}
Хорошо, теперь как насчет конкатенации, которая не вызывает перераспределения - мы собираемся объединить статические строки с помощью оператора "+":
static void Concat1()
{
string test = "Hello" + " " + "World";
}
Вот ИЛ - посмотрите, какой умный компилятор! Он не использует concat - он идентичен первому примеру:
.method private hidebysig static void Concat1() cil managed
{
.maxstack 1
.locals init (
[0] string test)
L_0000: nop
L_0001: ldstr "Hello World"
L_0006: stloc.0
L_0007: ret
}
Теперь давайте немного повеселимся. Что если мы смешаем статические строки и переменные? (это то место, где вам может быть лучше использовать string Builder)
static void Concat3(string text)
{
string test = "Hello" + " " + text + " World";
}
И Ил. Обратите внимание, что он был достаточно умен, чтобы объединить «Hello» и «» в качестве константы, но он все равно должен выполнить конкат для текстовой переменной:
.method private hidebysig static void Concat3(string text) cil managed
{
.maxstack 3
.locals init (
[0] string test)
L_0000: nop
L_0001: ldstr "Hello "
L_0006: ldarg.0
L_0007: ldstr " World"
L_000c: call string [mscorlib]System.String::Concat(string, string, string)
L_0011: stloc.0
L_0012: ret
}