2009-08-31 13 views
5

Si implemento un objeto con IDisposable, ¿deberían implementarlo también todos los objetos que poseen ese objeto, incluso si no tienen otros recursos para liberar?IDisposable chain

Respuesta

12

Sí. Debe deshacerse de ellos para que sus variables miembro se eliminen correctamente.

Cada vez que encapsula una clase IDisposable, debe hacer que su clase sea IDisposable. En su método Dispose, debe disponer de sus recursos encapsulados. Básicamente, trátelos de la misma manera que tratarías un recurso nativo.

+0

Sólo que no se puede asumir el orden en que los objetos se eliminan, si son inducidos por el hilo del finalizador GC. –

+0

Es cierto, pero no estoy seguro de cómo esto es relevante. Si ajusta su clase y la hace desechable, PUEDE controlar el orden en que se dispone cada recurso encapsulado. –

1

Si desea una eliminación determinista, en última instancia, algún cliente necesita llamar a Dispose o envolver las llamadas en un bloque "using". Para llegar hasta su objeto, puede ser necesario que el propietario implemente IDisposable también.

No debe confiar en el recolector de basura para liberar recursos dependientes del tiempo.

+0

Esto no es realmente un problema de recursos no administrados. Los objetos que poseen recursos no administrados 1) usan 'SafeHandle's o 2) usan un finalizador definido por el usuario para liberar los recursos no administrados. Si bien esto no es determinista, el recolector de basura * * puede liberar adecuadamente los recursos no administrados. El principal beneficio de las cadenas apropiadas de 'IDisposable' es el "cierre", el "final" o la "liberación" oportuna de los recursos sensibles al problema, como (pero definitivamente no limitado a) la E/S. –

+0

observado. Gracias. –

1

Sí, una clase propietaria debe implementar IDisposable pero no necesita (no debería tener) un Finalizer (destructor).

1

nop, que sólo tiene que utilizar esa clase con un "por medio de" declaración para asegurarse de que disponen de ese objeto correctamente, pero esos objetos en sí no es necesario para poner en práctica IDisplosable

+0

Si otra clase posee un objeto desechable, también debe implementar IDisposable. De lo contrario, la clase propietaria no tiene forma de permitir que los emisores de llamadas se deshagan de ella, y en consecuencia, los recursos disponibles que posee internamente. –

+0

solo depende de cómo la clase usa el objeto internamente – BlackTigerX

+0

Uso la palabra "propio" específicamente para significar "tiene una variable miembro del tipo especificado", así que no, esto no funciona. Uso el trabajo "usos" para lo que estás hablando. –