Lors de l'implémentation d'IDisposable, j'ai pris en compte que toute méthode qui ne devrait pas être appelée après que l'objet ait été éliminé devrait lancer le ObjectDisposedException
. Mais quel est le standard pour l'objet name qui devrait être passé au constructeur de l'exception?Que devrait être passé en tant que objectName lors du lancement d'une exception ObjectDisposedException?
Répondre
Je crois que la pratique recommandée est de jeter les éléments suivants:
throw new ObjectDisposedException(GetType().FullName);
Ou y compris le contrôle, ces deux lignes de code en haut de chaque méthode qui a besoin (de toute évidence pas la méthode Dispose
lui-même):
if (this.disposed)
throw new ObjectDisposedException(GetType().FullName);
Peut-être même utile de refactoriser cela en une minuscule méthode d'utilisation.
Je ne crois pas qu'il existe une norme pour cela, je retournerais le type de l'objet avec le contenu de la chaîne d'un champ d'identification unique (une sorte de «clé primaire»).
Même le .NET Framework lui-même n'est pas très cohérent ici.
David M. Kean (ancien développeur de l'équipe FxCop chez Microsoft) a ajouté un commentaire à la MSDN documentation for the ObjectDisposedException:
L'utilisation typique de ce type est quelque chose comme ce qui suit:
[C#] private void CheckDisposed() { throw new ObjectDisposedException(GetType().FullName); }
Je l'ai raté. Mut apprendre à lire les commentaires dans la documentation aussi. – Wilhelm
Ne vous inquiétez pas, il est parti maintenant. –
@JonathonReinhart: Le commentaire a été évidemment retiré de la version .NET 4 de la page. J'ai corrigé le lien ci-dessus afin qu'il se réfère à la version .NET 3.5 qui inclut le commentaire cité. – Albic
Aussi, s'il vous plaît voir cette question et ma réponse pour les directives générales: http://stackoverflow.com/questions/668440/handling-objectdisposedexception-correctly-in-an-idisposable-class-hierarchy – Noldorin