Estoy tratando de validar mi comprensión de cómo C# /. NET/CLR trata los tipos de valores y tipos de referencia. He leído tantas explicaciones contradictorias que todavía.NET Paso de parámetros - por referencia v/s por valor
Esto es lo que entiendo hoy, por favor corríjanme si mis suposiciones son incorrectas.
Los tipos de valor como int etc viven en la pila, los tipos de referencia viven en el montón administrado sin embargo si un tipo de referencia tiene una variable de instancia de tipo double, vivirá junto con su objeto en el montón
La segunda parte es lo que más me causa confusión.
Consideremos una clase simple llamada Persona.
La persona tiene una propiedad llamada Nombre.
Digamos que creo una instancia de Persona en otra clase, lo llamaremos UselessUtilityClass.
Considere el siguiente código:
class UselessUtilityClass
{
void AppendWithUnderScore(Person p)
{
p.Name = p.Name + "_";
}
}
y luego en algún lugar que hacemos:
Person p = new Person();
p.Name = "Priest";
UselessUtilityClass u = new UselessUtilityClass();
u.AppendWithUnderScore(p);
persona es un tipo de referencia, cuando se pasa a UselessUtilityClass - aquí es donde voy - tuercas .. .el VARIABLE p que es una instancia de la referencia de persona pasada por VALOR, lo que significa que cuando escriba p.Name veré "Priest_"
Y entonces si escribía
Person p2 = p;
Y lo hago
p2.Name = "No es un sacerdote";
y escribir el nombre de p, como a continuación voy a conseguir "No es un Sacerdote"
Console.WriteLine(p.Name) // will print "Not a Priest"
Esto es debido a que son los tipos de referencia y apuntan a la misma dirección en la memoria.
¿Es correcto mi entendimiento?
Creo que hay un malentendido cuando la gente dice Todos los objetos en .NET se pasan por la referencia, esto no se basa en lo que creo. Podría estar equivocado, es por eso que he venido a los Stackers.
La declaración sobre stack y heap no es del todo correcta. Consulte mi respuesta para obtener una explicación –
Ser un tipo de valor no tiene nada que ver con dónde se almacena. La única diferencia es que los tipos de valores tienen semántica de copia. El resto está definido por la implementación. – wj32
@Guffa: "Los tipos de valor como int etc. viven en la pila. Los tipos de referencia viven en el heap administrado. Sin embargo, si un tipo de referencia tiene una variable de instancia de tipo double, vivirá junto con su objeto en el heap. Correcto." Primero, esto depende de la implementación. En segundo lugar, no es cierto en la implementación de Microsoft; cf., por ejemplo, locales capturados. – jason