Il framework Microsoft.NET fornisce l'interfaccia IDisposable
che richiede un'implementazione del metodo void Dispose()
. Il suo scopo è quello di abilitare il rilascio manuale o basato su scope di risorse costose che potrebbero essere state assegnate all'implementazione IDisposable
. Gli esempi includono raccolte di database, flussi e maniglie.Le implementazioni IDisposable.Dispose() dovrebbero essere idempotenti?
La mia domanda è, nel caso in cui l'implementazione del metodo Dispose()
sia idempotente, quando viene chiamata più di una volta nella stessa istanza, l'istanza viene "eliminata" una sola volta e le chiamate successive non generano eccezioni. In Java, la maggior parte degli oggetti con comportamento simile (di nuovo flussi e connessioni di database mi vengono in mente come esempi) sono idempotenti per la loro operazione close()
, che risulta essere l'analogo per il metodo Dispose()
.
Tuttavia, la mia esperienza personale con .NET (e Windows Form in particolare), dimostra che non tutte le implementazioni (che sono parte del framework .NET per sé) sono idempotente, in modo che le chiamate successive a questi gettano un ObjectDisposedException
. Questo mi confonde davvero su come si dovrebbe avvicinare l'implementazione di un oggetto usa e getta. Esiste una risposta comune per lo scenario o dipende dal contesto concreto dell'oggetto e dal suo utilizzo?
Solo perché Microsoft non segue sempre la propria raccomandazione non significa che si dovrebbe. – linkerro
@linkerro - Puoi per favore espandere il tuo commento piuttosto criptico? – Oded
Mi chiedo se si riferisca a WinForms che lancia un'eccezione se Dispose a Control due volte. – DaveShaw