2010-03-10 17 views
8

Sé que algunas diferencias,¿Cuáles son las diferencias entre los tipos de valores y los tipos de referencia en C#?

  1. tipos de valor se almacenan en la pila donde como 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í, ¿qué son?

+8

pedido muchas veces ya en SO .... –

+0

@Wheat, Búsqueda rápida, no, esta pregunta no se ha formulado ni respondido directamente. – strager

+3

No tengo tiempo para responder a esto por completo en este momento, pero me gustaría señalar que "los tipos de valores se almacenan en la pila" es una exageración. Ver http://pobox.com/~skeet/csharp/memory.html. Para obtener más información sobre los tipos de referencia frente a los tipos de valores, consulte http://pobox.com/~skeet/csharp/references.html –

Respuesta

21

Lea: The stack is an implementation detail, y nunca más repita el canard que la asignación de la pila es lo que diferencia los tipos de valores 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.

+0

Dicho con dureza, pero bueno, esa es la mejor manera que aprendí, como si molestaste a Gandalf y lo esperaras explicándoselo con molestia en su voz, tiende a quedarse pegado = D – Coops

2

Según lo mencionado por Aaronaught y Eric entrada de blog:

recordar la regla, los tipos de referencia siempre va a la Pila, mientras que los tipos de valor siempre van a 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.

0

Creo que los valores se asignan implícitamente la memoria, pero no hacen referencia a los tipos que se deben asignar la memoria explícita

14

Aquí hay algunas diferencias adicionales:

  1. tipos de valor no puede ser hereditaria, mientras que los tipos de referencia puede
  2. Los tipos de valores se implementan como una estructura, los tipos de referencia como una clase
  3. Los tipos de valor, de forma predeterminada, no pueden asignarse valores nulos reales (la sintaxis? Es una solución y aún no da como resultado un verdadero valor nulo)
  4. Asignando un tipo de valor a otra variable, o pasándolo 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 una compilación -time error para que una estructura declare un constructor sin parámetros explícito, pero lo mismo no se aplica a una clase
  6. Es un error en tiempo de compilación utilizar el objeto "this" antes de asignar todos los campos en una estructura, pero el lo mismo no se aplica a una clase
  7. Es un error en tiempo de compilación para una estructura no asignar por completo todas las propiedades en su constructor, pero lo mismo no se aplica a una clase
Cuestiones relacionadas