La bonne utilisation de l'interface IDisposable

Je sais de lecture la documentation de Microsoft que le "primaire" de l'utilisation de la IDisposable interface est de nettoyer les ressources non managées.

Pour moi, "non géré" signifie des choses comme des connexions de base de données, des sockets, des poignées de fenêtre, etc. Mais, j'ai vu du code où l' Dispose() méthode est mise en œuvre à la libre géré ressources, qui semble redondant pour moi, depuis le garbage collector devrait prendre soin de cela pour vous.

Par exemple:

public class MyCollection : IDisposable
{
    private List<String> _theList = new List<String>();
    private Dictionary<String, Point> _theDict = new Dictionary<String, Point>();

    //Die, clear it up! (free unmanaged resources)
    public void Dispose()
    {
        _theList.clear();
        _theDict.clear();
        _theList = null;
        _theDict = null;
    }

Ma question est, est-ce faire le garbage collector libérer la mémoire utilisée par MyCollection plus vite qu'il le ferait normalement?

modifier: Donc, beaucoup de gens ont posté quelques bons exemples de l'utilisation de IDisposable pour nettoyer les ressources non managées comme des connexions de base de données et d'images. Mais supposons que _theList dans le code ci-dessus figurant un million de chaînes, et que vous vouliez pour libérer de la mémoire maintenant, plutôt que d'attendre que le garbage collector. Serait le code ci-dessus le réaliser?

  • J'aime la accepté de répondre parce que vous dire la bonne "pattern" de l'aide IDisposable, mais comme l'OP a dit, dans son édition, il ne répond pas à sa destinée question. IDisposable ne fait pas appel de la GC, c'est juste les "marques" à un objet destructible. Mais quelle est la véritable façon de libérer de la mémoire "right now" au lieu d'attendre pour les GC à coup de pied? Je pense que cette question mérite un examen plus approfondi.
  • IDisposable ne marque pas de quoi que ce soit. Le Dispose méthode fait ce qu'il a à faire pour nettoyer les ressources utilisées par l'instance. Cela n'a rien à voir avec le GC.
  • Je pense que vous avez mal compris ma question. Assumer ma classe implémente IDisposable et dans ma classe, je suis en utilisant une très grande liste de tableaux ou de quelque autre objet géré que j'ai mis à l'(marque comme) null lorsque l'Éliminer(true) est appelée sur une instance de ma classe. Maintenant, selon le modèle, ce que je fais ici est le marquage de la liste de tableaux de référence à null, mais la liste de tableaux d'objets de données dans la mémoire jusqu'à ce que le GC coups de pied dans ce qui est non-déterministe. Donc, la question est de savoir comment gratuit ce non référencées bloc de mémoire immédiatement et de façon déterministe.
  • encore une fois, vous êtes malentendu IDisposable. Il n'a rien à voir avec la libération de la mémoire. En outre, vous ne devez pas mettre votre référence à la valeur null à tous. Le laisser seul et de laisser le GC faire son travail.
  • Je ne comprends IDisposable. Et c'est pourquoi j'ai dit que l'on a accepté de répondre à ne pas répondre à l'OP est prévu à la question(et le suivi edit) si IDisposable aidera dans <i>la libération de la mémoire</i>. Depuis IDisposable n'a rien à voir avec la libération de la mémoire, de ressources, alors comme vous l'avez dit, il n'est pas nécessaire de définir la gestion des références à null, qui est ce que l'OP a été fait dans son exemple. Ainsi, la bonne réponse à sa question est "Non, ce n'est pas les aider à libérer de la mémoire plus rapide. En fait, il n'a pas d'aider à libérer de la mémoire, mais seulement de ressources". Mais de toute façon, merci pour vos commentaires.
  • si c'est le cas, alors vous ne devriez pas avoir dit "IDisposable ne fait pas appel de la GC, c'est juste les "marques" à un objet destructible"
  • Il n'y a aucun moyen de garantie de libérer de la mémoire de façon déterministe. Vous pourriez l'appeler GC.Collect(), mais c'est une demande polie, pas une demande. Tous les threads en cours d'exécution doit être suspendu pour la collecte des ordures à procéder - lire sur le concept de .NET points de restauration si vous voulez en savoir plus, par exemple, msdn.microsoft.com/en-us/library/678ysw69(v=vs. 110).aspx . Si un thread ne peut pas être suspendu, par exemple, parce qu'il y a un appel dans le code non managé, GC.Collect() peut ne rien faire du tout.

InformationsquelleAutor cwick | 2009-02-11