2011-07-04 21 views
5

En C#, cuando tengo dos objetos obj1, obj2 compone de una List<string> y asigno ambos de esos objetos a la misma List<string> objeto.C colección # basura con referencias a objetos

Si mi referencia a obj1 queda fuera del alcance pero mi referencia a obj2 no, ¿es obj1 aún elegible para la recolección de basura, o hay algunos problemas de dependencia porque todavía hay una referencia al objeto List<string>?

+6

+! Buena pregunta, pero ¿podría escribirla en código? – harpo

+1

Parece una buena pregunta, pero no estoy muy seguro porque no está claro qué está pasando con * obj1 *, * obj2 *, y los objetos List ... ¿puedes aclarar? – Matt

Respuesta

3

En su caso, obj1debe ser elegible para la recolección de basura.

Debe mirar Jon Skeet'sanswer aquí. Explica claramente cómo funciona la recolección de basura en referencias de objetos.

Un buen tutorial para usted en Object's Lifetime in C#.

+0

la 'Lista ' o el puntero a la 'Lista '? – Enigmativity

1

obj1 debe ser elegible para la recolección de basura, siempre que no haya referencias a obj1 en sí.

+0

Esto es cierto si se refiere al puntero definido por 'obj1' y no a la instancia de' List 'apuntada por' obj1'. – Enigmativity

+0

@Enigmativity: ¡Por supuesto! :) – Mrchief

-1

Si obj1 es miembro de una lista, no está disponible para la recolección de basura hasta que la lista principal sea basura.

Así:

List<string> l = new List<string>(); 

string a = "one"; 
l.Add(a); 

{ 
    string b = "two"; 
    l.Add(b); 
} 

Al final de este listado, a es en su alcance, b está fuera de alcance, pero ambos todavía tienen referencias en la lista l, por lo que tampoco son aptos para reciclaje.

+0

No estoy seguro de por qué esto fue votado negativamente: un comentario sobre por qué está mal o una mala respuesta sería bueno. –

1

Si mi referencia a obj1 sale de alcance, pero mi referencia a obj2 hace no, es obj1 aún es elegible para recolección de basura, o hay algunos problemas de dependencia porque hay siendo una referencia a el objeto List ?

Si he entendido bien que quiere decir tanto obj1 y obj2 son de tipo List<string> y ambos apuntan a la misma List<string> ejemplo.

Cuando obj1 sale del alcance, todavía habrá obj2 como referencia activa para la instancia List<string>, por lo que no se puede recolectar la basura.

Si obj1 era parte de un tipo de referencia en el montón (es decir, una de sus propiedades), el espacio de memoria que ocupaba podía ser basura recogida como parte del objeto externo. Si solo fuera una referencia en la pila, GC no estará involucrado ya que la pila simplemente se desenrollará al final de la llamada al método cuando obj1 se salga del alcance.

Tenga en cuenta que obj1 es solo una referencia (en cierto modo un puntero) a un objeto en el montón: este objeto puede ser basura recolectada solo cuando ya no hay ninguna referencia apuntando a él.

0

Hay tres usos de la memoria definidos en esta pregunta:

  • un puntero a la instancia llamada List<string>obj1.
  • un puntero a la instancia List<string> llamada obj2.
  • La instancia de List<string>.

si obj1 sale del ámbito, pero obj2 no lo hace, entonces sólo la siguiente quedan después de la recolección de basura:

  • un puntero a la instancia llamada List<string>obj2.
  • La instancia de List<string>.

Es importante recordar que C# abstrae el concepto de punteros en la mayoría de los casos por lo que se puede pensar de manera segura de obj1 y obj2 como List<string> y no punteros, punteros, pero que son.

Cuestiones relacionadas