Источник: https://blogs.msdn.microsoft.com/ericlippert/2009/09/28/string-interning-and-string-empty/
Строковое интернирование - это метод оптимизации компилятором. Если у вас есть два одинаковых строковых литерала в одном модуле компиляции, то сгенерированный код гарантирует, что для всего экземпляра этого литерала (символы, заключенные в двойные кавычки) внутри сборки создан только один строковый объект.
Я из C # фона, поэтому я могу объяснить, приведя пример из этого:
object obj = "Int32";
string str1 = "Int32";
string str2 = typeof(int).Name;
вывод следующих сравнений:
Console.WriteLine(obj == str1); // true
Console.WriteLine(str1 == str2); // true
Console.WriteLine(obj == str2); // false !?
Примечание1 : объекты сравниваются по ссылке.
Примечание2 : typeof (int). Имя оценивается методом отражения, поэтому оно не оценивается во время компиляции. Вот эти сравнения сделаны во время компиляции.
Анализ результатов:
1) истина, потому что они оба содержат одинаковые литералы и поэтому сгенерированный код будет иметь только один объект, ссылающийся на «Int32». См. Примечание 1 .
2) true, потому что проверяется содержимое обоих значений.
3) FALSE, потому что str2 и obj не имеют одинаковые литералы. См. Примечание 2 .