web-dev-qa-db-fra.com

Le garbage collector appelle-t-il Dispose ()?

Je pensais que le GC appellerait Dispose éventuellement si votre programme ne le faisait pas mais que vous devriez appeler Dispose () dans votre programme juste pour rendre le nettoyage déterministe.

Cependant, à partir de mon petit programme de test, je ne vois pas du tout Dispose appelé ...

public class Test : IDisposable
{
    static void Main(string[] args)
    {
        Test s = new Test();
        s = null;
        GC.Collect();
        Console.ReadLine();
    }

    public Test()
    {
        Console.WriteLine("Constructor");
    }

    public void Dispose()
    {
        Console.WriteLine("Dispose");
    }
}

// La sortie est juste "Constructor", je n'obtiens pas "Dispose" comme je m'y attendais. Quoi de neuf?

EDIT: Oui, je sais que je devrais appeler Dispose () - Je respecte le modèle standard lorsque j'utilise des objets jetables. Ma question se pose parce que j'essaie de retrouver une fuite dans le code de quelqu'un d'autre, qui est géré en C++ (une autre couche de complexité qui serait le bon sujet d'un autre thread).

58
noctonura

Le GC n'appelle pas Dispose, il appelle votre finaliseur (que vous devriez appeler Dispose(false)).

Veuillez consulter les articles connexes sur le côté ou rechercher les meilleures pratiques C # pour le modèle Dispose (Les documents sur IDisposable l'expliquent assez bien IIRC.)

54
Eloff

La réponse courte est "non". Des réponses plus détaillées peuvent être trouvées dans mes réponses à "Est-ce une mauvaise pratique de dépendre du garbage collector .NET" et "Que se passe-t-il si je n'appelle pas Dispose ()"

2
Dave Black