60 votes

Est-ce que garbage collector appelle Dispose ()?

Je pensais que le GC allait appeler dispose finalement, si votre programme n'a pas mais que vous devez appeler Dispose() dans votre programme juste pour faire le nettoyage déterministe.

Cependant, à partir de mon petit programme de test, je ne vois pas Disposer d'avoir à intervenir à tous....

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 "Constructeur", je n'ai pas "Jeter" comme je m'attends. Qu'est-ce?

EDIT: Oui, je sais que je devrais appeler dispose() - je fais suivre le modèle standard lors de l'utilisation d'objets jetables. Ma question se pose parce que je suis en train de traquer une fuite de quelqu'un elses code, qui est géré en C++ (une autre couche de complexité qui serait le bon sujet d'un autre fil).

55voto

Eloff Points 5224

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

Veuillez consulter les publications associées sur le côté ou recherchez les meilleures pratiques C # pour le modèle Dispose (les documents de IDisposable expliquent assez bien, IIRC.)

2voto

Dave Black Points 1396

La réponse courte est "non". Vous trouverez des réponses plus détaillées dans les réponses aux questions "Est-ce une mauvaise pratique de dépendre du collecteur de déchets .NET" et "Que se passe-t-il si je n'appelle pas Dispose ()"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X