لماذا لا يسمى بلدي صافي المدمر في هذا السيناريو بسيط جدا؟

StackOverflow https://stackoverflow.com/questions/606524

سؤال

ولقد حصلت على التعليمات البرمجية التالية:

 public class A
    {
        ~A()
        {
            Console.WriteLine("destructor");
        }
    }

 public static A Aref;
 static void Main(string[] args)
    {
        Aref = new A();
        int gen = GC.GetGeneration(Aref);
        Aref = null;
        GC.Collect(gen, GCCollectionMode.Forced);
        Console.WriteLine("GC done");

    }

واعتقدت أن يسمى لي طريقة Finalizer على دعوتي إلى الأسلوب GC.Collect، والذي ليس هو الحال.

ويمكن لأي شخص أن يفسر لي لماذا؟

هل كانت مفيدة؟

المحلول

لا تسمى

وأدوات الإنهاء قبل أن تعود GC.Collect(). وتشغيل أدوات الإنهاء في موضوع مستقل - يمكنك الانتظار بالنسبة لهم بالدعوة GC.WaitForPendingFinalizers()

نصائح أخرى

لا يسمى finalizer خلال جمع في المثال الخاص بك، والسبب لا يزال قيد الجذور من قبل طابور finalizable. لكن ومن المقرر أن الصيغة النهائية، وهو ما يعني أنه سيتم جمعها أثناء جمع القمامة المقبل.

إذا كنت تريد أن تجعل حالات مؤكدة لأنواع مع تجمع ما عليك القيام به مجموعتين مثل هذا finalizer.

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

ولكن عموما يجب أن لا استدعاء الأسلوب Collect() نفسك.

وحتى لو كنت تسأل عن GC لجمع، فمن غير متأكد أن هذا الكائن المحدد سيتم تدمير (لأنه لا يمكن أن يكون في الجيل يجري جمعها في تلك اللحظة)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top