Desde ambos son tipos de referencia, ¿por qué tienen diferentes resultados?
Porque los objetos string
están altamente optimizados. En particular, dado que son inmutables, pueden ser internados por el compilador para evitar la duplicación.
Si tiene dos objetos diferentes string
que representan exactamente la misma cadena de caracteres (como en su ejemplo), el compilador reconocerá eso y mantendrá solo una instancia del objeto de cadena real.
El resultado es que los objetos s1
y s2
son en realidad el mismo objeto en lo que respecta al compilador e incluso hacen referencia a la misma ubicación en la memoria.
Esta contabilidad ocurre detrás de escena en algo llamado "mesa de pasante", pero eso no es realmente algo con lo que deba preocuparse. Lo importante es que todos los literales de cadena son internados por defecto por el compilador.
El mismo tipo de cosas no suceden para objetos StringBuilder
, porque no son inmutables. Están diseñados para permitirle modificar un objeto de cadena, y como tal, las optimizaciones no tienen mucho sentido. Es por eso que sus objetos sb1
y sb2
se ven en realidad como dos objetos diferentes.
La regla de oro es bastante simple: utilice string
de forma predeterminada, o cuando desee una sola cadena de caracteres inmutables. Solo use StringBuilder
cuando desee modificar la misma cadena varias veces, por ejemplo, en un bucle u otra sección relativamente corta de código.
lectura relevantes: Optimizing C# String Performance
Está comparando dos referencias de objeto 'StringBuilder' diferentes. Son dos objetos separados. – birryree
+1, no solo por una pregunta excelente, sino por preguntarla tan claramente, con una muestra completa de código que se ha comentado perfectamente. –
Esta pregunta en realidad no tiene nada que ver con 'StringBuilder'. Se trata realmente de "¿por qué dos variables de cadena inicializadas con dos literales de cadena que contienen la misma secuencia de caracteres se comparan como si fueran el mismo objeto"? –