2011-05-16 12 views
6
var a = MyClassInstance; 
    MyClassInstance = null; 
    //if (a !=null){ //why } 

creo que a puntos a MyClassInstance y MyClassInstance es igual a cero, entonces a debe ser igual a cero también. Pero a no es nulo y no entiendo por qué.Tipos de referencia

+0

No creo que sea la forma correcta de "nuilificar" una clase. Puede que tengas que llamar a una función de destrucción interna. Está configurando algo en la clase a NULL pero la clase actaull todavía existe y no es nula ... – ppumkin

Respuesta

4

La variable a es una referencia, por lo que el valor que posee es la "ubicación" de algún objeto. MyClassInstance es también una referencia. Al establecer a = MyClassInstance ambos apuntan a la misma instancia. Establecer MyClassInstance en null solo afecta a esa referencia. No afecta al objeto en sí y no afecta a ninguna otra referencia.

5

a y MyClassInstance son referencias a un objeto.
Cambiar una referencia no cambia la otra.

var a = MyClassInstance; // Both references point to the same object 
MyClassInstance = null; // MyClassInstance now points to null, a is not affected 
+0

a y MyClassInstance son referencias a un objeto? No al área de la memoria? – Alexandre

+1

Al final del día, esto es lo mismo. –

+0

@Alex el hecho de que las referencias se implementan como punteros es un detalle de implementación http://blogs.msdn.com/b/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx – AakashM

2

Debido a que va a asignar a la variable nullMyClassInstance que acaba referencia la instancia actual, situado en el montón. No tocas tu instancia de clase real de ninguna manera.

De hecho, no puede liberar directamente la memoria que ocupa su instancia de clase; esto es para lo que es el recolector de basura. Parece que hay referencias (piense en punteros, pero no) en su instancia, y si no queda ninguna, el objeto se elimina/recopila de la memoria.

Tal vez esto hace que sea más claro: http://en.csharp-online.net/Value_vs_Reference

2

La variable de una instancia de tipo de referencia es principalmente un puntero a una dirección de memoria - para que su ejemplo es comparable a

int MyClassInstance = 0x1234; // points to a memory containing *your* values 
int i = MyClassInstance; 
MyClassInstance = 0x0; 
if (i !=0x0){ //still 0x1234, because it's a copy } 

O en otras palabras: la variable es la referencia, no el objeto en sí. Entonces la segunda variable es una copia de la referencia.

+0

Pero es un valor tipos, no referencias! – Alexandre

+0

Sí, y como su nombre lo indica: un tipo de referencia. Entonces, lo que obtienes cuando creas una variable de un tipo de referencia es ** referencia **. Y una referencia para sí misma es un tipo de valor especial para abordar la memoria. Dependiendo de su CPU, es un valor de 32 o 64 bits. – Kelon

Cuestiones relacionadas