Como la cadena es tipo ref en dotnet, cuando actualizamos la variable x , ¿debería haber una actualización en y también? (ya que se refiere al valor de x). programa de muestra que se proporciona a continuación, ¿cómo el valor de y no cambia cuando se actualiza x?
public void assignment() { string x= "hello"; string y=x; // referencing x as string is ref type in .net x = x.Replace('h','j'); Console.WriteLine(x); // gives "jello" output Console.WriteLine(y); // gives "hello" output }Tienes razón en que, inicialmente, tanto x como y hacen referencia al mismo objeto:
+-----------+ y -> | hello | +-----------+ ^ x --------+Ahora echa un vistazo a esta línea:
x = x.Replace('h','j');Sucede lo siguiente:
x.Replace crea una nueva cadena (con h reemplazada por j) y devuelve una referencia a esta nueva cadena.
+-----------+ +------------+ y -> | hello | | jello | +-----------+ +------------+ ^ x --------+ Con x = ... , asigna x a esta nueva referencia. y todavía hace referencia a la cadena anterior.
+-----------+ +------------+ y -> | hello | | jello | +-----------+ +------------+ ^ x --------------------------+ Entonces , ¿ cómo se modifica una cadena en el lugar? tu no C# no admite la modificación de cadenas en el lugar. Las cadenas están diseñadas deliberadamente como una estructura de datos inmutable . Para una estructura de datos similar a una cadena mutable, use StringBuilder :
var x = new System.Text.StringBuilder("hello"); var y = x; // note that we did *not* write x = ..., we modified the value in-place x.Replace('h','j'); // both print "jello" Console.WriteLine(x); Console.WriteLine(y);Ya hay buenas respuestas aquí por qué sucede esto. Sin embargo, si desea que ambos impriman "gelatina", puede asignar x a y por referencia utilizando la palabra clave ref .
string x = "hello"; ref string y = ref x; x = x.Replace('h', 'j'); Console.WriteLine(x); // gives "jello" output Console.WriteLine(y); // gives "jello" outputMás información sobre Ref locales aquí .
La cadena devuelta es una NUEVA referencia de cadena. Con respecto a string.Replace(), MSDN dice:
"Este método no modifica el valor de la instancia actual. En su lugar, devuelve una nueva cadena en la que todas las apariciones de oldValue se reemplazan por newValue"
https://docs.microsoft.com/en-us/dotnet/api/system.string.replace?view=net-5.0 .
Como mencionó @Heinzi, las cadenas son inmutables y la mayoría de las acciones realizadas en las cadenas dan como resultado nuevas cadenas:
"Los objetos de cadena son inmutables: no se pueden cambiar después de haberlos creado. Todos los métodos de cadena y los operadores de C# que parecen modificar una cadena en realidad devuelven los resultados en un nuevo objeto de cadena".
¡Salud!