Existe-t-il une méthode, ou une autre méthode légère, pour vérifier si une référence concerne un objet jeté?
P.S. - C'est juste une curiosité (bien dormir, pas dans le code de production). Oui, je sais que je peux attraper le ObjectDisposedException
en essayant d'accéder à un membre de l'objet.
System.Windows.Forms.Control
A une propriété IsDisposed
qui est définie sur true après l'appel de Dispose()
. Dans vos propres objets IDisposable, vous pouvez facilement créer une propriété similaire.
Il n'y a rien de intégré qui permettra cela. Vous devez exposer une propriété booléenne IsDisposed qui reflète un indicateur disposé en interne.
public class SimpleCleanup : IDisposable
{
private bool disposed = false;
public bool IsDisposed
{
get
{
return disposed;
}
}
public SimpleCleanup()
{
this.handle = /*...*/;
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// free only managed resources here
}
// free unmanaged resources here
disposed = true;
}
}
public void Dispose()
{
Dispose(true);
}
}
Si ce n'est pas votre classe et qu'elle ne fournit pas de propriété IsDisposed (ou quelque chose de similaire - le nom n'est qu'une convention), alors vous n'avez aucun moyen de le savoir.
Mais si c'est votre classe et que vous suivez implémentation canonique IDisposable , alors exposez simplement le champ _disposed ou _isDisposed en tant que propriété et vérifiez cela.
La méthode Dispose
est requise pour effectuer le nettoyage requis avant l'abandon d'un objet; si aucun nettoyage n'est requis, il n'est pas nécessaire de faire quoi que ce soit. Obliger un objet à savoir s'il a été supprimé, même si la méthode Dispose
ne ferait rien autrement, nécessiterait de nombreux objets IDisposable
pour ajouter un indicateur pour un avantage très limité.
Cela aurait pu être utile si IDisposable
incluait deux propriétés - l'une qui indiquait si un objet à éliminer, et l'autre indiquant que l'objet n'avait pas été rendu inutile par élimination. Pour les objets où l'élimination fait réellement quelque chose, les deux valeurs seraient initialement vraies et deviendraient fausses après Dispose
. Pour les objets dont l'élimination n'a pas besoin de faire de nettoyage, la première méthode peut toujours retourner false et la seconde toujours true, sans avoir à stocker un indicateur n'importe où. Je ne pense pas qu'il y ait aucun moyen de les ajouter à .NET maintenant, cependant.
Je vois que c'est vieux, mais je n'ai pas vu de réponse. Certains objets jetables comme un DataSet n'ont pas tous un événement supprimé que vous pouvez attacher.
class DisposeSample : IDisposable
{
DataSet myDataSet = new DataSet();
private bool _isDisposed;
public DisposeSample()
{
// attach dispose event for myDataSet
myDataSet.Disposed += MyDataSet_Disposed;
}
private void MyDataSet_Disposed(object sender, EventArgs e)
{
//Event triggers when myDataSet is disposed
_isDisposed = true; // set private bool variable as true
}
public void Dispose()
{
if (!_isDisposed) // only dispose if has not been disposed;
myDataSet?.Dispose(); // only dispose if myDataSet is not null;
}
}