Да - Вы можете увидеть это в явном виде, используя ILDASM.
Пример:
Вот программа, похожая на ваш пример, за которой следует скомпилированный код CIL:
Примечание: я использую функцию String.Concat () просто чтобы посмотреть, как компилятор обрабатывает два разных метода конкатенации.
Программа
class Program
{
static void Main(string[] args)
{
string s = "test " + "this " + "function";
string ss = String.Concat("test", "this", "function");
}
}
ILDASM
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 29 (0x1d)
.maxstack 3
.locals init (string V_0,
string V_1)
IL_0000: nop
IL_0001: ldstr "test this function"
IL_0006: stloc.0
IL_0007: ldstr "test"
IL_000c: ldstr "this"
IL_0011: ldstr "function"
IL_0016: call string [mscorlib]System.String::Concat(string,
string,
string)
IL_001b: stloc.1
IL_001c: ret
} // end of method Program::Main
Обратите внимание, как в IL_0001 компилятор создал константу «протестировать эту функцию», а не то, как компилятор обрабатывает функцию String.Concat () - которая создает константу для каждого из параметров .Concat (), а затем вызывает. Функция Concat ().