No, no todas las cadenas con el mismo valor son la misma referencia de objeto.
Las cadenas generadas por el compilador se internarán y serán la misma referencia. Las cadenas generadas en tiempo de ejecución no se internan por defecto y serán referencias diferentes.
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
Nota por encima de la línea donde se puede forzar una cadena a ser internados utilizando String.Intern(string)
que a su vez permite el uso de igualdad de objetos en lugar de igualdad de cadenas de algunos cheques, lo cual es mucho más rápido. Un ejemplo en el que esto se usa con mucha frecuencia es dentro del código de serializador XML generado junto con la tabla de nombres.
No soy un experto pero eche un vistazo a este enlace sobre la internación de cadenas. http://en.csharp-online.net/CSharp_String_Theory%E2%80%94String_intern_pool – ChaosPandion
Vea también mi artículo sobre esto para algunos comentarios adicionales: http://blogs.msdn.com/ericlippert/archive/2009/09/ 28/string-interning-and-string-empty.aspx –
@Eric - Gran lectura, gracias por publicar el enlace. – ChaosPandion