Строковые литералы автоматически интернируются средой выполнения .NET. Это означает, что один и тот же экземпляр строки является общим для строковых литералов с одинаковым значением. Это сделано, чтобы уменьшить использование памяти и улучшить производительность. Это безопасная оптимизация, потому что строки неизменны.
Ваш код компилируется в CIL инструкции, подобные следующим:
IL_0001: ldstr "Hello world!"
IL_0006: stloc.0
IL_0007: ldstr "Bonjour le monde"
IL_000c: stloc.1
etc...
Из документации инструкции ldstr
("загрузить буквенную строку") в спецификации ECMA :
По умолчанию CLI гарантирует, что результат двух инструкций ldstr, относящихся к двум токенам метаданных, которые
имеют одинаковую последовательность символов, возвращают точно такой же строковый объект (процесс, известный как "строка"
interning "). Это поведение можно контролировать с помощью System.Runtime.CompilerServices.CompilationRelaxationsAttribute
и System.Runtime.CompilerServices.CompilationRelaxations.NoStringInterning
.
Вы также можете сами интернировать строки, вызывая метод String.Intern .