2011-01-19 13 views
15

Bueno He mirado en los genéricos y tienen siguiente pregunta:Lista <T> - ¿paso objetos o referencias?

List<someClass> list=new List<someClass> 

SomeClass MyInstance=SomeClass(); 

list.Add(MyInstance); 

No estoy seguro de lo que va a ser añadido a la lista - Referencia o un objeto de tipo de referencia (señalando al valor real de MyInstance).
EDITAR: ¿O agregaré valor (que es tipo de datos de referencia) que apunta al objeto real?

Gracias

+2

Las clases siempre se pasan como referencias – Sklivvz

+3

@Skliwz: "Las clases siempre se pasan como referencias" En primer lugar, las clases no se pasan a ninguna parte. Hay objetos y, para nuestros propósitos (lo que significa que estoy ocultando algunos detalles), son instancias de tipos de valores o instancias de tipos de referencia. En segundo lugar, a menos que un parámetro esté marcado con 'ref' o' out' se pasa POR VALOR.Repito que: todos los parámetros, a menos que estén marcados con 'ref' o' out', se pasan por valor, independientemente de si el parámetro es una instancia de un tipo de valor o una instancia de un tipo de referencia. Para los tipos de referencia, el valor es la referencia. – jason

Respuesta

20

Cuando tratas con los tipos de referencia que siempre está tratando referencias, por lo que se le añadirá una referencia a la lista (una copia de la referencia en realidad). En realidad no tienes elección; así es como funciona el lenguaje.

+0

angren: También en realidad el valor del tipo de referencia se agregará a la lista. Y este valor apunta a objetar en el montón – Lojol

+0

Sí, dije eso aquí mismo: "una copia de la referencia en realidad" –

4

Dado que someClass es un tipo de referencia, se copiará en la lista una referencia a MyInstance.

6

Suponiendo que someClass es un tipo de referencia (por ejemplo, clase) y no un tipo de valor (por ejemplo, struct), entonces es una referencia.

También admito que sería muy diabólica para definir una estructura con el nombre algunaClase

struct someClass

Y aquí está la obligatory link al artículo de Jon Skeet en el paso de parámetros.

1

se añadirá una referencia desde MyInstance es de tipo referencia

-1

La lista almacenará la referencia del objeto en lugar de la instancia de objeto.

En realidad, el valor del almacén de listas por matriz de uso y matriz almacena la referencia en la pila y almacena la instancia del objeto en el montón.

+0

No es correcto. Las referencias se almacenan en el montón. La referencia a 'List <>' en sí * puede * estar en la pila, pero las referencias que contiene no lo son. –

-1

Si desecha el objeto como el siguiente

MyInstance = null 

entonces, no se puede leer el objeto MyInstance,

pero todavía se puede leer el objeto en la lista,

porque tiene dos referencias señalan a MyInstance,

En otras palabras, el objeto tiene dos referencias,

uno es

SomeClass MyInstance=SomeClass(); 

la otra se puede almacenar en la lista,

y que acaba de desechar una de ellas,

por lo que aún se puede leer la lista [0]

+0

La pregunta era si había o no una referencia o un valor en la lista, la respuesta es * referencia *, como ya se respondió. –

+0

Establecer una variable a 'null' es * no * 'desechable'. –

Cuestiones relacionadas