هل هو قانوني لإعادة الجذور الإشارة إلى هذا في .صافي المدمر?

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

سؤال

هل هو قانوني كتابة ما يلي في .الشبكة ؟

   public class A
    {
        public int i = 0;
        ~A()
        {
            Aref = this;
        }
    }


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

يعمل ويكتب '0' إلى وحدة التحكم كما هو متوقع, ولكن أنا أتساءل عما إذا كان مضمونة للعمل دائما.

لا أحد يعرف ما يحدث وراء المشهد ؟

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

المحلول

وانه دعا القيامة، وانها قانونية. جوجل عن "قيامة الكائن دوت" (وشروط مثل ذلك) وسوف تجد أشياء مثل:

القيامة والقمامة. NET جامع

كائن القيامة

وفقط للتأكد من هذه الكائنات غيبوبة لا يعود ويحاول أن يأكل دماغك أو شيء من هذا. مثل كل استحضار الأرواح، وهذا هو الاشياء خطير. (في الغالب بسبب ارتفاع أدوات الإنهاء حتى في التسلسل الهرمي فئة يمكن أن يكون الإفراج عن بعض الموارد الأساسية. لاحظ أيضا أن finalizer لن يتم تشغيل مرة ثانية إذا كان الكائن يحصل "غير مرجعية"، إلا إذا كنت استدعاء GC.ReRegisterForFinalize).

نصائح أخرى

وكان يعمل لجمع القمامة الأول لا تجمع المثيل. انها مجرد جداول المقام أن يكون المدى finalizer لها. وfinalizer ثم يقوم بإنشاء جذر جديد إلى مثيل، وذلك عندما يحدث جمع المقبل المثال متجذر في الواقع، وبالتالي غير قابلة للجمع.

ويجب أن تكون حذرا جدا مع هذه صعبة. إذا تم استخدام finalizer للتأكد من التخلص من كائن، وهذا يخالف الواقع البروتوكول لأن أنماط المتاح تقول إن مثيل التخلص منها يجب بطرح ObjectDisposedException إذا تم استخدامه بعد التخلص منها.

جامع القمامة يقسم الأشياء إلى ثلاث مجموعات:

  1. تلك التي لا تزال على قيد الحياة, لأنه في الماضي التحقق من الجذور الإشارة موجودة خارج الصيغة النهائية الانتظار ؛
  2. تلك التي تحتاج إلى حذف لأنه لا متجذرة مرجع موجود في أي مكان ؛
  3. تلك التي تحتاج إلى وضع اللمسات الأخيرة لأن الجذور مرجع موجود في استكمال قائمة الانتظار ، ولكن في أي مكان آخر.
كائنات لا يمكن حذفها إلا إذا كان لا يوجد الجذور إشارة في أي مكان.الصيغة النهائية هي مرحلة منفصلة قبل الحذف ؛ نلاحظ أنه في حين كائن مسجل استكمال جميع الكائنات يشير بشكل مباشر أو غير مباشر وسوف تكون محمية من الحذف ، ولكن ليس من وضع الصيغة النهائية.

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