Quando si implementa IDisposable, sottolineo che ogni metodo che non dovrebbe essere chiamato dopo che l'oggetto è stato eliminato dovrebbe lanciare lo ObjectDisposedException
. Ma qual è lo standard per l'oggetto nome che dovrebbe essere passato al costruttore dell'eccezione?Cosa deve essere passato come oggettoName quando si lancia un oggetto ObjectDisposedException?
risposta
Credo che la pratica raccomandata è quello di gettare il seguente:
throw new ObjectDisposedException(GetType().FullName);
o comprendente la verifica, queste due righe di codice nella parte superiore di ogni metodo che (non ovviamente il metodo Dispose
stesso) ha bisogno:
if (this.disposed)
throw new ObjectDisposedException(GetType().FullName);
Potrebbe anche essere utile ricondizionarlo in un piccolo metodo di usabilità.
Non credo ci sia uno standard per questo, vorrei restituire il tipo dell'oggetto insieme al contenuto stringa di un campo identificativo univoco (una 'chiave primaria' di sorta).
Anche lo stesso .NET Framework non è molto coerente qui.
David M. Kean (ex sviluppatore del team di Microsoft FxCop) ha aggiunto un commento alla MSDN documentation for the ObjectDisposedException:
L'utilizzo tipico di questo tipo è qualcosa di simile al seguente:
[C#] private void CheckDisposed() { throw new ObjectDisposedException(GetType().FullName); }
Mi è mancato. Mut impara anche a leggere i commenti nella documentazione. – Wilhelm
Non preoccuparti, ora non c'è più. –
@JonathonReinhart: il commento è stato ovviamente rimosso dalla versione 4 .NET della pagina. Ho corretto il collegamento sopra in modo che si riferisca alla versione 3.5 .NET che include il commento citato. – Albic
Inoltre, si prega di vedere questa domanda e la mia risposta per le linee guida generali: http://stackoverflow.com/questions/668440/handling-objectdisposedexception-correctly-in-an-idisposable-class-hierarchy – Noldorin