Comment savoir si un IDisposable référence d'objet est disposé?

Est-il une méthode, ou d'une autre lumière-poids moyen, pour vérifier si une référence à un objet supprimé?

P. S. - C'est juste une curiosité (bien dormir, pas dans le code de production). Oui, je sais que je peux attraper le ObjectDisposedException lors de la tentative d'accès à un membre de l'objet.

  • Je ne sais pas. Il semble curieux qu'il n'y a pas un bool IsDisposed { get; } déclaration sur System.IDisposable.
  • Le Dispose méthode dirige un objet à la libération de tout et de toutes les ressources qu'il a acquis mais non encore publié. Si un objet ne tient jamais ses ressources, ses Dispose méthode en général n'a rien à faire; si le type déclare void IDisposable.Dispose() {}; il peut ignorer IDisposable avec pas par exemple les frais généraux. Un IsDisposed propriété qui devrait être vrai à la suite de toute Dispose appel nécessiterait l'ajout d'une inutile indicateur Booléen à chaque instance de beaucoup de types qui, autrement, pourraient ignorer Dispose.
  • Mais, où que vous appeler une méthode sur un objet qui implémente IDisposable, comment pouvez-vous vérifier s'il a été éliminé en premier? Plutôt que de supposer qu'il n'est pas le cas et que l'interception d'une exception? Ou d'une certaine manière vous êtes censé gérer la durée de vie de sorte que vous devriez toujours savoir si il est éliminé ou pas?
  • Vous ne devez pas utiliser un objet sans savoir qu'il n'a pas été et ne seront pas éliminés, sauf dans les cas où l'on est préparé à l'égard de l'élimination de l'objet par le code extérieur comme un signal pour annuler des actions en cours avec elle. Un IsDisposed drapeau peut aider à prévenir le code de perdre du temps sur des opérations qui ne peut pas réussir, mais on aurait encore besoin de gérer des exceptions dans le cas d'un objet devient disposé entre la IsDisposed contrôle et la tentative de l'utiliser.
  • WeakReference semble pertinent ici. Ce n'est pas exactement un IDipose avais détecteur, mais il ne vous dire si c'est de la GC avait
  • Tout cela n'aide pas tous les IDisposables, et il nécessite l'avance de temps pour la planification, si vous avez un System.ComponentModel.IComponent, il y a un Disposed cas, vous pouvez joindre à, comme indiqué dans le Moïse réponse