2009-08-31 4 views
5

Si j'implémente un objet avec IDisposable, tous les objets qui possèdent cet objet doivent-ils également l'implémenter, même s'ils n'ont pas d'autres ressources à libérer?Chaîne IDisposable

Répondre

12

Oui. Vous devez en disposer pour que vos variables membres soient correctement éliminées.

Chaque fois que vous encapsulez une classe IDisposable, vous devez rendre votre ID de classepossible. Dans votre méthode Dispose, vous devez disposer de vos ressources encapsulées. Fondamentalement, traitez-les de la même manière que vous traiteriez une ressource native.

+0

Seulement vous ne pouvez pas assumer l'ordre dans lequel les objets sont disposés, s'ils sont induits par le filetage du finisseur GC. –

+0

Oui, mais je ne suis pas sûr de savoir comment cela est pertinent. Si vous enveloppez votre classe et la rendez disponible, vous pouvez contrôler l'ordre dans lequel chaque ressource encapsulée est éliminée. –

1

Si vous souhaitez une élimination déterministe, un client doit finalement appeler Dispose ou encapsuler les appels dans un bloc «using». Pour arriver à votre objet, cela peut nécessiter que le propriétaire implémente IDisposable.

Vous ne devriez pas compter sur le garbage collector pour libérer des ressources dépendant du temps.

+0

Ce n'est pas vraiment un problème de ressources non managées. Les objets qui possèdent une ressource non gérée vont 1) utiliser 'SafeHandle's ou 2) utiliser un finaliseur défini par l'utilisateur pour libérer les ressources non managées. Bien que cela ne soit pas déterministe, le garbage collector * est capable de libérer correctement les ressources non managées. Le principal avantage des bonnes chaînes 'IDisposable' est la" fermeture ", la" fin "ou la" libération "des ressources sensibles au problème, comme (mais sans s'y limiter) les E/S. –

+0

Noté. Merci. –

1

Oui, une classe propriétaire doit implémenter IDisposable mais elle n'a pas besoin (ne devrait pas avoir) de Finalizer (destructeur).

1

nop, ils ont juste besoin d'utiliser cette classe avec un « en utilisant » déclaration pour vous assurer qu'ils disposent cet objet correctement, mais ces objets eux-mêmes ne pas besoin de mettre en œuvre IDisplosable

+0

Si une autre classe possède un objet jetable, elle doit également implémenter IDisposable. Sinon, la classe propriétaire n'a aucun moyen de permettre aux appelants d'en disposer, et par conséquent, les ressources disponibles dont elle dispose en interne. –

+0

cela dépend simplement de la façon dont la classe utilise l'objet en interne – BlackTigerX

+0

J'utilise le mot "propre" spécifiquement pour signifier "a une variable membre du type spécifié", donc non cela ne fonctionne pas. J'utilise le travail "use" pour ce dont tu parles. –

Questions connexes