¿Cuáles son las diferencias entre los tipos de valores y los tipos de referencia en C #?

Sé algunas diferencias,

  1. Los tipos de valores se almacenan en la stack donde los tipos de referencia se almacenan en el montón administrado.
  2. Las variables de tipo de valor contienen directamente sus valores, mientras que las variables de referencia solo contienen una referencia a la ubicación del objeto que se crea en el montón administrado.

¿Hay alguna otra diferencia que eché de menos … Si es así, cuáles son?

Lea: la stack es un detalle de implementación , y nunca más repita el canard que la asignación de la stack es lo que diferencia los tipos de valor de los tipos de referencia en .NET. El CLR puede elegir asignar una variable donde quiera.

La diferencia más importante está en la semántica de la asignación. Cuando asigna un tipo de valor a una variable (o lo pasa a un método como argumento), se copian todos los datos. Cuando asigna un tipo de referencia, solo se copia una referencia; ambas referencias apuntan a la misma instancia de objeto en la memoria.

Aquí hay algunas diferencias adicionales:

  1. Los tipos de valores no se pueden heredar, mientras que los tipos de referencia pueden
  2. Los tipos de valor se implementan como una estructura, los tipos de referencia como una clase
  3. A los tipos de valor, de forma predeterminada, no se les pueden asignar valores nulos reales (la syntax? Es una solución temporal y aún así no da como resultado un verdadero valor nulo)
  4. Asignar un tipo de valor a otra variable, o pasarlo como un parámetro en un método, hace una copia, mientras que con un tipo de referencia la variable representa la ubicación de la memoria del objeto
  5. Es un error en tiempo de comstackción para una estructura declarar un constructor sin parámetros explícito, pero lo mismo no se aplica a una clase
  6. Es un error en tiempo de comstackción utilizar el objeto “this” antes de que se asignen todos los campos en una estructura, pero lo mismo no se aplica a una clase
  7. Es un error en tiempo de comstackción para una estructura no asignar por completo todas las propiedades en su constructor, pero lo mismo no se aplica a una clase

Como lo mencionó la publicación del blog Aaronaught and Eric:

¿Recuerda la regla, los tipos de referencia siempre van al montón, mientras que los tipos de valor siempre van donde fueron declarados? Si un Tipo de valor se declara fuera de un método, pero dentro de un Tipo de referencia se colocará dentro del Tipo de referencia en el Heap.

Creo que los valores se asignan implícitamente a la memoria, pero no a los tipos de referencia. Se les debe asignar memoria explícitamente.