2010-08-06 12 views

Respuesta

7

No. Todos los objetos .NET administrados normalmente obtienen basura cuando deja de referirse a ella. IDisposable significa que implementará un método Dispose() que debe ser llamado por la persona que llama; por lo general, libera cosas que no se guardan en la basura. También ayuda a tener un lugar determinista para liberar memoria.

Salida del patrón IDisposable para asegurarse de que lo haces bien:

http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/09/21/10887.aspx

+0

Gracias por su respuesta. Entonces, si tengo una clase A y una de sus funciones públicas crea un objeto no administrado como mapa de bits y llama a BitMap.Dispose(), ¿será basura o la clase A guarda una referencia al mapa de bits? – kishore

+0

Cuando llame a Dispose(), se eliminará en ese momento (el objeto no se puede usar). Si no lo hizo, el GC lo alcanzaría eventualmente, y si estaba escrito correctamente (lo era), entonces el Finalizar llamará a Dispose(). Pero se requiere llamar a Dispose() (use la instrucción using para hacerlo automáticamente). –

+0

Además, definitivamente no debe implementar IDisposable a menos que lo necesite. Hace que el GC sea más lento para tener que lidiar con ellos (recordar llamar a Finalize, etc.). Si tiene una propiedad que es desechable o no administrada, vaya a implementarla. –

3

No, todos los objetos se eliminan automáticamente.

IDisposable se puede usar cuando tiene que realizar algún tipo de operación especial en la deconstrucción del objeto. Por ejemplo, si bloquea algunos recursos como archivos o cosas durante el trabajo de su objeto, puede liberarlos en su método Dispose.

1

IDisposable debe utilizarse cuando desee utilizar algún recurso nativo, como flujo de archivos en su código. Para todos los demás fines, el recolector de basura .Net hace un buen trabajo.

Simplemente implmentando el IDisposable no fuerza una recolección de basura. El método Dispose debe llamarse explícitamente para limpiar cualquier recurso nativo.

Editar: Le aconsejaré que vaya a través del capítulo Garbage Collection en ClR via C# por Jeff Richter.

1

No. Su clase definida por el usuario es una colección con guardapolvos cuando ya no se hace referencia en ninguna parte. Puede forzar esto simplemente haciendo classObject = null. Si esa es la última parte de la aplicación que hace referencia actualmente al classObject, la recolección de basura borrará su memoria.

IDisposable se utiliza principalmente para que pueda organizar las actividades de recolección de basura a través de los métodos using().

1

No, no lo hace. El método Dispose() está diseñado para hacer un trabajo extra. Elimine los recursos que deben eliminarse cuando el objeto ya no se utiliza. Recuerde, la basura recolectada puede pasar mucho tiempo después de que el objeto perdió su última referencia.

Cuando el IDisposable se utiliza debe disponer el objeto cuando el hecho con fx using como

using (SomeClassWithDisp object = new SomeClassWithDisp()) 
{ 
    //Use the object 
} 

También, ver:

What is the difference between using IDisposable vs a destructor in C#?

1

En .NET, todos los objetos deben ser liberados desde la memoria con el recolector de basura por defecto, siempre que ya no se usen, por lo que no es necesario que implemente IDisposable en cada clase, pero es bueno tener algún tipo de memo mecanismo de liberación, como un destructor o el método Dispose.

Este es un buen ejemplo de un destructor que se utiliza: http://www.developer.com/net/csharp/article.php/3343191/C-Tip-Forcing-Garbage-Collection-in-NET.htm

1

El método dispose() se implementa se utiliza para liberar explícitamente los recursos no administrados (archivos, arroyos, manijas, etc.) en que su objeto contiene una referencia.

La idea es liberar estos recursos tan pronto como sea posible, llamando al método de eliminación. El método dispose() no ejecutará INMEDIATAMENTE la recolección de basura en su objeto, sino que liberará los recursos y permitirá que el recolector de basura haga su trabajo cuando sea conveniente.

Cuestiones relacionadas