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
- 1. Quando deve essere eliminato un oggetto ManualResetEvent?
- 2. Cosa deve essere passato in if() per stampare 'Hello World'?
- 3. Cosa deve essere passato per il parametro @object di BeginInvoke?
- 4. ObjectDisposedException Quando si utilizza MD5 ComputeHash
- 5. Quando un riferimento deve essere atomico?
- 6. Come allegare un bitmap quando si lancia ACTION_SEND intento
- 7. Se in un metodo è richiesto un solo campo oggetto, cosa deve essere passato come parametro: un oggetto o un valore di campo?
- 8. Struct.Error, deve essere un oggetto Bytes?
- 9. Cosa deve fare un sito web che deve essere scalato?
- 10. Quale istruzione throw lancia se non dico quale tipo di oggetto deve essere gettato in C++?
- 11. Cosa deve essere inserito nell'assembleaTrademarkAttribute?
- 12. Quando si usa typeid su un oggetto polimorfico, deve essere definito?
- 13. Quando deve essere usato assert()?
- 14. Quando deve essere utilizzato WS_EX_NOREDIRECTIONBITMAP?
- 15. Quando deve essere chiamato super.onResume()?
- 16. Perché Fabric lancia "TypeError: l'argomento deve essere un int, o avere un metodo fileno()"?
- 17. Haskell "where" indentation: perché deve essere indentato l'identificatore passato?
- 18. oggetto Constant non può essere passato come parametro var
- 19. Quando deve essere rimosso removeStickyEvent (...)?
- 20. System.Runtime.InteropServices.COMException quando si lancia un file PDF su Windows Phone
- 21. Che cosa significa "operatore = deve essere un membro non statico"?
- 22. DDD: "Paese" deve essere un oggetto valore o un'entità?
- 23. Lancia o prova + cattura
- 24. Blocco di ottava quando deve essere tracciato
- 25. Quando JavaScript NON deve essere gzip?
- 26. Cosa significa LPCWSTR e come deve essere gestito?
- 27. Perché la funzione defaultWriteObject deve essere chiamata per prima quando si scrive in un ObjectOutputStream?
- 28. Cosa succede se un costruttore lancia un'eccezione?
- 29. Come specificare quale controllo deve essere focalizzato quando si apre un modulo?
- 30. Cosa viene passato?
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