6
votes

L'utilisation principale de l'interface Idisposable

Dupliqué possible:
Utilisation correcte de l'interface Idisposable

L'article "Interface Idisposable" raconte:

L'utilisation principale de cette interface consiste à libérer des ressources non gérées

pourquoi? Pourquoi seulement non géré?

Tout ma vie, je pensais que son utilisation primiraly est de libérer toutes les ressources: gérées (connexions à DBS, proxies de services, etc.) et non gérées (si elles sont utilisées en application).

P.s.

Je crois qu'il y a déjà des questions sur ce sujet, mais je ne peux pas les trouver.


2 commentaires

Les ressources gérés sont nettoyées automatiquement par le collecteur des ordures. L'idiposable fournit une manière standard pour que les ressources non gérées soient libérées.


Essayez ici - Beaucoup de bonnes informations: Stackoverflow .com / questions / 538060 / ...


5 Réponses :


5
votes

Si vous lisez plus loin, il y a une explication:

Le collecteur des ordures automatiquement libère la mémoire allouée à un objet géré lorsque cet objet n'est pas utilisé plus longtemps. Cependant, ce n'est pas possible de prédire quand des ordures la collecte se produira. Par ailleurs, Le collecteur des ordures n'a aucune connaissance des ressources non gérées telles que la fenêtre poignées, ou ouvrir des fichiers et des flux.

Le collecteur des ordures prend soin des ressources gérées. C'est pourquoi ils sont géré .

En outre, la ressource de connexion dans votre exemple n'est pas gérée des ressources. Les classes de connexion .NET enveloppent des ressources non gérées.


0 commentaires

6
votes

Les connexions sous-jacentes aux DB ne sont pas gérées, de même que les poignées de fichier et un certain nombre d'autres objets O / S de bas niveau. Ils sont non gérés. La mise en œuvre d'une interface Idisposable implique que vous ne comptez pas uniquement sur le collecteur des ordures pour libérer ces ressources; Mais vous fermez ces ressources à l'aide de l'API de faible niveau que vous avez disponible.

Aussi, je pense que Eric Lippert's Réponse (2e baisse) à une question similaire est une très bonne explication sur la raison pour laquelle vous utiliseriez Idisposable .


1 commentaires

Néanmoins, la question est fermée comme dupliquée, je veux accepter cette réponse. David, vous êtes la seule personne qui a attiré mon attention que la connexion à DB est en fait une ressource non gérée ... cela a du sens. Je savais que j'ai toujours besoin de le fermer (ou de disposer), mais j'ai toujours pensé qu'ils sont nommés «géré». Merci!



2
votes

iDisposable.Dispose () est responsable de deux choses:

  • libérer des ressources non gérées que l'objet pourrait posséder
  • Dispose () autre Idisposable s appartenant à l'objet

0 commentaires

0
votes

Votre réponse à

pourquoi? Pourquoi seulement non géré?

La durée de vie des ressources gérées est contrôlée par le collecteur des ordures. Qui est l'une des raisons jadis que vous utilisez c # ou java.


0 commentaires

0
votes

au lieu de "ressources non gérées", pensez "responsabilités". Lorsqu'un objet est décrit comme contenant des "ressources non embliquées", ce que cela signifie vraiment:

  1. La classe a l'information et l'élan nécessaires pour faire quelque chose à une entité extérieure.
  2. Si cette action ne se fait jamais, quelque chose d'autre ne fonctionnera pas aussi bien que sinon (les effets peuvent être mineurs ou graves).
  3. Si la classe n'est pas exécutée, rien d'autre ne le fera.

    La situation la plus courante dans laquelle une classe aura des responsabilités de nettoyage est lorsque une autre entité a été invitée à réserver quelque chose (que ce soit un fichier, une poignée GDI, une serrure, une machine à sous réseau, un bloc de mémoire, une chaîne de communication ou autre) jusqu'à ce que remarquer. Si rien ne dit cette autre entité que la chose qu'il est réservée n'est plus nécessaire, cela ne laissera jamais rien d'autre à l'utiliser.

    Si un objet qui a une responsabilité importante d'effectuer certaines mesures est balayé par le collecteur des ordures avant de remplir sa responsabilité, l'action ne sera jamais effectuée. Il y a deux façons que cela puisse être empêché:

    1. Si un objet implémente Idisposable, "Quelqu'un" (un autre objet ou une procédure d'exécution) doit être prévu pour appeler la méthode avant d'abandonner. Disposer ne devrait pas être considéré comme détruisant un objet, mais dire plutôt à un objet de mener à bien ses responsabilités finales afin qu'elle puisse être abandonnée en toute sécurité.
    2. Les objets peuvent demander au système de leur faire savoir quand ils ont été abandonnés, avant qu'ils soient balayés. Bien que de telles notifications puissent réduire le danger qu'une action requise ne pourrait jamais être effectuée, il est dangereux de compter sur eux puisqu'ils ne seront souvent pas de manière particulièrement opportune, et dans certains cas ne pourront jamais venir du tout.

      Les objets fournis à la deuxième approche de nettoyage sont appelés "ressources gérées".


0 commentaires