Нет, не все строки с одинаковыми значениями имеют одинаковую ссылку на объект.
Все строки, сгенерированные компилятором, будут Interned и будут одной и той же ссылкой. Строки, генерируемые во время выполнения, по умолчанию не интернированы и будут разными ссылками.
var s1 = "abc";
var s2 = "abc";
var s3 = String.Join("", new[] {"a", "b", "c"});
var s4 = string.Intern(s3);
Console.WriteLine(ReferenceEquals(s1, s2)); // Returns True
Console.WriteLine(ReferenceEquals(s1, s3)); // Returns False
Console.WriteLine(s1 == s3); // Returns True
Console.WriteLine(ReferenceEquals(s1, s4)); // Returns True
Обратите внимание на строку выше, где вы можете принудительно интернировать строку, используя String.Intern(string)
, которая затем позволяет вам использовать равенство объектов вместо равенства строк для некоторых проверок, что намного быстрее. Один пример, где это очень часто используется, находится внутри сгенерированного кода XML-сериализатора вместе с таблицей имен.