Microsoft.NET framework proporciona la interfaz IDisposable
que requiere una implementación del método void Dispose()
. Su propósito es permitir la liberación manual o basada en el alcance de recursos costosos que una implementación de IDisposable
puede haber asignado. Los ejemplos incluyen colecciones de bases de datos, flujos y manejadores.¿Las implementaciones IDisposable.Dispose() deben ser idempotentes?
Mi pregunta es, si la implementación del método Dispose()
fuera idempotente - cuando se llama más de una vez en la misma instancia, la instancia a la que se 'desechará' una sola vez y las siguientes no lanzarán excepciones. En Java, la mayoría de los objetos que tienen un comportamiento similar (nuevamente, las secuencias y las conexiones a la base de datos vienen a mi mente como ejemplos) son idempotentes para su operación close()
, que resulta ser el análogo para el método Dispose()
.
Sin embargo, mi experiencia personal con .NET (y Windows Forms, en particular), muestra que no todas las implementaciones (que son parte del propio marco .NET) son idempotente, de manera que las llamadas posteriores a éstos lanzan una ObjectDisposedException
. Esto realmente me confunde sobre cómo se debe abordar la implementación de un objeto desechable. ¿Hay una respuesta común para el escenario o depende del contexto concreto del objeto y su uso?
El hecho de que Microsoft no siga siempre su propia recomendación no significa que deba hacerlo. – linkerro
@linkerro - ¿Podrías por favor ampliar tu comentario algo críptico? – Oded
Me pregunto si se está refiriendo a que WinForms arrojará una excepción si Deshace un Control dos veces. – DaveShaw