Nein, nicht alle Strings mit dem gleichen Wert sind die gleichen Objektreferenzen.
Vom Compiler generierte Strings werden alle interniert und haben dieselbe Referenz. Zur Laufzeit generierte Strings werden standardmäßig nicht interniert und sind unterschiedliche Referenzen.
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
Beachten Sie die Zeile oben, wo Sie eine Zeichenfolge zwingen kann, zu verwenden String.Intern(string)
interniert, die dann können Sie Objekt Gleichheit statt Zeichenfolge Gleichheit für einige Kontrollen verwenden, die viel schneller ist. Ein Beispiel, in dem dies sehr häufig verwendet wird, ist innerhalb des generierten XML-Serializer-Codes zusammen mit der Namenstabelle.
Ich bin kein Experte, aber überprüfen Sie diesen Link auf String Internment. http://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_intern_pool – ChaosPandion
Siehe auch meinen Artikel dazu für einige zusätzliche Kommentare: http://blogs.msdn.com/ericlippert/archive/2009/09/ 28/string-interning-and-string-empty.aspx –
@Eric - Großartig gelesen, vielen Dank für den Link. – ChaosPandion