2010-03-09 20 views
12

¿Alguien puede decirme cómo puedo liberar objetos en C#? Por ejemplo, tengo un objeto:¿Cómo puedo liberar objetos en C#

Object obj1 = new Object(); 
//Some code using obj1 
/* 
Here I would like to free obj1, 
after it is no longer required 
and also more importantly 
its scope is the full run time of the program. 
*/ 

Gracias por toda su ayuda

Respuesta

7

Usted no tiene que hacerlo. Simplemente deje de hacer referencia a ellos, y el recolector de basura (en algún punto) los liberará por usted.

Debe implementar IDisposable en tipos que utilizan recursos no administrados y envolver cualquier instancia que implemente IDisposable en una declaración using.

+2

o simplemente use C++/CLI en su lugar, para que no tenga que recordar qué tipos implementan IDisposable y cuáles no, llamará automáticamente a Dispose cuando el objeto salga del alcance (si no está declarado como identificador) –

+4

¡apenas una razón convincente para usar C++/CLI! :) –

+0

@Ben Voigt Si implementa IDisposable correctamente, se llamará a la función Dispose cuando también quede fuera del alcance en C#. –

0

Deja de hacer referencia a ellos y deja que el recolector de basura los tome.

Cuando se desea liberar el objeto, agregue la siguiente línea:

obj1 = null;

El recolector de basura si es libre para eliminar el objeto (siempre que no haya otra puntero al objeto que lo mantiene vivo .)

+1

No moleste anulando referencias a menos que la referencia sea estática. La referencia eventualmente quedará fuera del alcance que hará que la instancia sea elegible para la recolección de basura. –

16

No es necesario. El recolector de basura del tiempo de ejecución vendrá y lo limpiará por ti. Es por eso que usted está usando C# y no en C++ no administrado en el primer lugar :)

+0

¿Va a GC limpiarlo solo si ya no hay referencias (o enlaces) al objeto, o también liberará el objeto cuando GC detecte que después de un punto el código no utiliza el objeto en absoluto (incluso si su alcance es decir el método de todo el hombre, debido a que su tiempo de vida será el tiempo completo de ejecución del programa)? – assassin

+1

@assasin: Recoge cuando no hay referencias, punto. GC no hace el trabajo del compilador. Por lo tanto, no puede recopilar si hay una referencia, incluso si no se usará en el futuro. Es por eso que debemos tener cuidado con los objetos estáticos. Pero en tu ejemplo de método principal, depende. Las referencias de la pila tienen alcance principal. Pero los objetos a los que apuntan pueden o no depender de si sus referencias se reasignan. – Fakrudeen

1

Puede utilizar la instrucción using. Después del alcance, se eliminará la referencia al objeto y el recolector de elementos no utilizados podrá recopilarlo en otro momento.

+3

Esto solo se aplica a los objetos que implementan IDisposable – Arve

5

No es así. Esto es lo que hace automáticamente un recolector de basura: básicamente, cuando el tiempo de ejecución de .NET necesita memoria, se activa y elimina los objetos que ya no se usan.

Lo que tienes que hacer para que esto funcione es eliminar todos los linnks del objeto.

En su caso ....

obj1 = null;

al final, luego el objeto ya no se referencia y se puede reclamar desde el recolector de basura.

Puede consultar http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) para obtener más información.

Tenga en cuenta que si el objeto tiene referencias a recursos no administrados (como archivos abiertos, etc.) debe implementar el patrón Desechable (interfaz IDisposable) y debe liberar explícitamente esas referencias cuando ya no necesite el objeto.

+2

No es necesario realizar obj1 = null; –

+1

Iba a sugerir asignar a nulo, pero una pequeña lectura dice que realmente * puede * retrasar * la recolección de basura en C#. Que interesante. Consulte este artículo para obtener más información sobre por qué no debe asignar nulo en C#: http://blogs.msdn.com/csharpfaq/archive/2004/03/26/97229.aspx –

+0

Un problema con esto es cuando invoca objetos COM alojados en otro proceso. El otro proceso recibirá el diálogo clásico de "advertencia del servidor COM" porque C# permite que la referencia permanezca. Estoy bastante seguro de que establecer la referencia a nulo tendría un impacto cuando se trata de eso. –

3

No es recomendable, pero si realmente es necesario, puede forzar a través de la recolección de basura:

GC.Collect(); 
+9

No es recomendable llamar a GC.Collect. Consulte http://blogs.msdn.com/ricom/archive/2004/11/29/271829.aspx – Arve

+4

Sugerir a alguien que llame a GC.Collect() es un mal consejo de la OMI. –

0

Como ya han dicho que no es necesario para liberar de forma explícita; Sin embargo, algo que no se ha mencionado es que, si bien es cierto que el recolector de basura incorporado los liberará, no hay garantía de CUÁNDO el recolector de basura lo liberará.

Todo lo que se sabe es que cuando se ha salido del alcance, PUEDE ser limpiado por el GC y en algún momento lo será.

0

GC recogerá todos los recursos, excepto los no administrados.

Los recursos no administrados deben implementar IDisposable. Si está utilizando un objeto que implementa IDisposable, debe llamar al método Dispose() del objeto cuando ya no lo necesite o envolver su instancia en una declaración using.