Sto implementando una classe .NET che implementa IDisposable. Dopo essere stato eliminato, lo stato dell'oggetto non è valido e quindi nessuno dovrebbe accedervi, naturalmente.
Ci sono alcune situazioni in cui due sistemi essenzialmente indipendenti hanno accesso alla stessa istanza di questa classe. Uno essenzialmente "possiede" l'oggetto ma l'altro è incaricato di interagire con l'oggetto in modo persistente.
Se il "proprietario" sceglie di sbarazzarsi dell'oggetto chiamando Dispose su di esso, l'altro sistema deve saperlo perché altrimenti potrebbe provare a interagire con un oggetto non valido. Non è sempre conveniente che il proprietario informi l'altro sistema di interrompere l'utilizzo dell'oggetto, perché il proprietario stesso potrebbe non conoscere questo altro sistema.
Ho la classe che implementa una proprietà IsDisposed, ma ci sono situazioni in cui il polling diventa impraticabile e sarebbe preferibile che il "non-proprietario" riceva invece la notifica che l'oggetto è eliminato.
A tal fine ho pensato che implementare un evento Disposing sulla classe sarebbe stata una buona soluzione, ma questo porta ad alcune domande progettuali:
-
L'istanza considerata è già stata eliminata nel momento in cui viene generato l'evento? (La mia ipotesi sarebbe che dovrebbe essere considerato vivo fino a quando i conduttori non finiscono.)
-
Come dovrebbe reagire l'oggetto a un'ulteriore manipolazione che si verifica all'interno dei gestori di eventi? (La mia ipotesi è di reagire nel solito modo per un oggetto vivente poiché è ancora vivo.)
-
Cosa succede se un gestore stesso chiama Dispose sull'oggetto? (Potremmo o ignorare esplicitamente le chiamate rientranti o semplicemente supporre che i gestori ben educati non lo facciano.)
-
L'evento Disposed dovrebbe ancora essere sollevato nel caso in cui l'oggetto sia finalizzato senza essere stato eliminato in modo esplicito? (Non riesco a pensare a un caso di mano in cui un tale evento sarebbe effettivamente necessario, e sicuramente ha il potenziale per causare problemi.)
Mi chiedo se ci sia qualche saggezza consolidata su come questo schema debba essere progettato in generale, o su qualsiasi altro esempio di cui dovrei essere a conoscenza di dove è probabile il problema.