Un parámetro en un método parece estar siempre pasando una copia, la pregunta es una copia de qué. Un constructor de copias realiza una copia de un objeto y, dado que todas las variables son Object en C #, creo que este es el caso para todas ellas. Las variables (objetos) son como las personas que viven en algunas direcciones. Cambiamos a las personas que viven en esas direcciones o podemos crear más referencias a las personas que viven en esas direcciones en la guía telefónica (hacer copias superficiales). Por lo tanto, más de un identificador puede referirse a la misma dirección. Los tipos de referencia desean más espacio, por lo que, a diferencia de los tipos de valores que están directamente conectados por una flecha a su identificador en la pila, tienen valor para otra dirección en el montón (un espacio más grande para habitar). Este espacio debe tomarse del montón.
Tipo de valor: Identificador (contiene el valor = dirección del valor de la pila) ----> Valor del tipo de valor
Tipo de referencia: Identificador (contiene el valor = dirección del valor de la pila) ----> (contiene el valor = dirección del valor del montón) ----> Valor del montón (la mayoría de las veces contiene direcciones a otros valores), imagine más flechas pegadas en diferentes direcciones a Array [0], Array [1], array [2]
La única forma de cambiar un valor es seguir las flechas. Si una flecha se pierde / cambia en la forma en que el valor es inalcanzable.