Pregunta

¿Cuál es el propósito de implementar la interfaz IDisposable? He visto algunas clases implementándolo y no entiendo por qué.

¿Fue útil?

Solución

Si su clase crea recursos no administrados, puede implementar IDisposable para que estos recursos se limpien correctamente cuando se elimine el objeto. Anula Dispose y suéltalos allí.

Otros consejos

Cuando sus clases utilizan algún recurso del sistema, es responsabilidad de la clase asegurarse de que el recurso también esté liberado. Por diseño .Net se supone que debes hacer eso en el método Dispose de la clase. La interfaz IDisposable marca que su clase necesita liberar recursos cuando ya no está en uso, y el método Dispose está disponible para que los usuarios de su clase puedan llamarlo para liberar los recursos consumidos.

El método IDisposable también es esencial si desea que la limpieza automática funcione correctamente y desea utilizar la instrucción using ().

Además de liberar recursos no administrados, los objetos pueden realizar alguna operación útilmente en el momento en que quedan fuera del alcance. Un ejemplo útil podría ser un objeto de temporizador: tales objetos podrían imprimir el tiempo transcurrido desde su construcción en el método Dispose (). Estos objetos podrían usarse para registrar el tiempo aproximado que se tarda en un conjunto de operaciones:

using(Timer tmr=new Timer("blah"))
{
    // do whatever
}

Esto se puede hacer manualmente, por supuesto, pero creo que uno debería aprovechar siempre que sea posible la capacidad del compilador para generar el código correcto automáticamente.

Todo tiene que ver con el mecanismo de recolección de basura. Chris Sells describe la recolección de basura, los finalizadores y la razón del patrón Dispose (y la interfaz IDisposable) episodio 10 de .NET Rocks! (a partir de unos 34 minutos).

Muchos objetos manipulan otras entidades de manera que causarán problemas si no se limpian. Estas otras entidades pueden ser casi cualquier cosa, y pueden estar en casi cualquier lugar. Como ejemplo, un objeto Socket puede pedirle a otra máquina que abra una conexión TCP. Esa otra máquina podría no ser capaz de manejar muchas conexiones a la vez; de hecho, podría ser un dispositivo equipado con web que solo puede manejar una conexión a la vez. Si un programa abriera un zócalo y simplemente se olvidara de él, ninguna otra computadora podría conectarse al dispositivo a menos que o hasta que el zócalo se cerrara (tal vez el dispositivo podría cerrar el zócalo después de unos minutos de inactividad, pero sería inútil hasta entonces).

Si un objeto implementa IDisposable, eso significa que tiene el conocimiento y el ímpetu necesarios para realizar las acciones de limpieza necesarias, y dichas acciones deben realizarse antes de que se pierda dicho conocimiento e ímpetu. Llamar a IDisposable.Dispose asegurará que todas esas acciones de limpieza se lleven a cabo, con lo cual el objeto puede abandonarse de forma segura.

Microsoft permite que los objetos soliciten protección contra el abandono registrando un método llamado Finalizar. Si un objeto lo hace, se llamará al método Finalizar si el sistema detecta que el objeto ha sido abandonado. Ni el objeto, ni ningún objeto al que tenga referencias directas o indirectas, se borrarán de la memoria hasta que el método Finalizar tenga la oportunidad de ejecutarse. Esto proporciona una especie de "respaldo". en caso de que un objeto se abandone sin ser primero eliminado. Sin embargo, hay muchas trampas con objetos que implementan Finalizar, ya que no hay garantía de cuándo se llamará. No solo se puede abandonar un objeto mucho tiempo antes de que se llame a Finalizar, sino que si uno no tiene cuidado, el sistema puede llamar a Finalizar en un objeto mientras parte de él todavía está en uso. Cosas peligrosas Es mucho mejor usar Dispose correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top