.NET, Architecture, ALM, Cloud

Publicité

Garbage Collector

Que va afficher le programme suivant ? : 

        public class MyClass : IDisposable
        {
            private string  _s;

            publicMyClass(string s)
            {
                _s = s;
            }

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

            ~MyClass()
            {
                Console.WriteLine("Finalyze MyClass {0}", _s);
            }
        }

        static void Main(string[] args)
        {
            MyClass myClass = new MyClass("Instance1");

            Console.WriteLine(GC.GetGeneration(myClass));
            GC.Collect();
            Console.WriteLine(GC.GetGeneration(myClass));

            WeakReference wr = new WeakReference(new MyClass("Instance2"));
            Console.WriteLine(wr.IsAlive);
            GC.Collect(0);
            Console.WriteLine(wr.IsAlive);

            Console.ReadLine();

        }

  • a) 0
    Finalyze MyClass Instance1
    Dispose MyClass
    1
    True
    False
    Finalyze MyClass Instance2
    Dispose MyClass
  • b) 1
    2
    True
    True
  • c) 0
    1
    True
    Finalyze MyClass Instance2
    False
  • d) 0
    1
    True
    Finalyze MyClass Instance2
    Dispose MyClass
    False
Publicité
Retour à l'accueil
Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
M
<br /> Bonne réponse : c.<br /> <br /> <br /> Le garbage collector conserve ses objets sur trois générations (0,1,2). A chaque collecte l'objet remonte d'une génération mais n'est finalisée (~) que quand celui-ci n'est plus à porté. La<br /> première instance sera finalisée après le ReadLine. Pour contrôler la libération de la ressource, voir le pattern IDisposable.<br /> <br /> <br /> Pour pouvoir libérer une ressource autrement qu'avec le pattern IDisposable, il est possible d'utiliser une référence faible (WeakReference) qui sera finalisée à la prochaine collecte du Garbage<br /> Collector. Cette instance est librée car l'ojbet n'est pas référencé dans la graphe du Garbage Collector et n'a donc aucune liaison avec l'instance du programme.<br />
Répondre