Конкатенация времени компиляции C# для строковых констант

этот SQL Server? Разве Вы не могли записать хранимую процедуру TSQL что циклы через и объединения результаты вместе?

мне также интересно, если существует способ только для SQL сделать это все же. От битов я помню от своего географического класса баз данных, должно быть.

9
задан Joseph Sturtevant 19 November 2009 в 16:40
поделиться

2 ответа

Да, это так. Вы можете проверить это, используя ildasm или Reflector для проверки кода.

static void Main(string[] args) {
    string s = "A" + "B";
    Console.WriteLine(s);
}

транслируется в

.method private hidebysig static void  Main(string[] args) cil managed {
    .entrypoint
    // Code size       17 (0x11)
    .maxstack  1
    .locals init ([0] string s)
    IL_0000:  nop
    IL_0001:  ldstr      "AB" // note that "A" + "B" is concatenated to "AB"
    IL_0006:  stloc.0
    IL_0007:  ldloc.0
    IL_0008:  call       void [mscorlib]System.Console::WriteLine(string)
    IL_000d:  nop
    IL_000e:  br.s       IL_0010
    IL_0010:  ret
} // end of method Program::Main

Есть кое-что еще более интересное, но связанное с этим. Если у вас есть строковый литерал в сборке, CLR создаст только один объект для всех экземпляров того же литерала в сборке.

Таким образом:

static void Main(string[] args) {
    string s = "A" + "B";
    string t = "A" + "B";
    Console.WriteLine(Object.ReferenceEquals(s, t)); // prints true!
}

напечатает на консоли «True»! Эта оптимизация называется интернированием строк .

15
ответ дан 4 December 2019 в 10:04
поделиться

Согласно Reflector :

Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");
Console.WriteLine("ABCDEF");

даже в конфигурации отладки.

6
ответ дан 4 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: