هل هو قانوني لإعادة الجذور الإشارة إلى هذا في .صافي المدمر?
-
03-07-2019 - |
سؤال
هل هو قانوني كتابة ما يلي في .الشبكة ؟
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' إلى وحدة التحكم كما هو متوقع, ولكن أنا أتساءل عما إذا كان مضمونة للعمل دائما.
لا أحد يعرف ما يحدث وراء المشهد ؟
المحلول
وانه دعا القيامة، وانها قانونية. جوجل عن "قيامة الكائن دوت" (وشروط مثل ذلك) وسوف تجد أشياء مثل:
وفقط للتأكد من هذه الكائنات غيبوبة لا يعود ويحاول أن يأكل دماغك أو شيء من هذا. مثل كل استحضار الأرواح، وهذا هو الاشياء خطير. (في الغالب بسبب ارتفاع أدوات الإنهاء حتى في التسلسل الهرمي فئة يمكن أن يكون الإفراج عن بعض الموارد الأساسية. لاحظ أيضا أن finalizer لن يتم تشغيل مرة ثانية إذا كان الكائن يحصل "غير مرجعية"، إلا إذا كنت استدعاء GC.ReRegisterForFinalize
).
نصائح أخرى
وكان يعمل لجمع القمامة الأول لا تجمع المثيل. انها مجرد جداول المقام أن يكون المدى finalizer لها. وfinalizer ثم يقوم بإنشاء جذر جديد إلى مثيل، وذلك عندما يحدث جمع المقبل المثال متجذر في الواقع، وبالتالي غير قابلة للجمع.
ويجب أن تكون حذرا جدا مع هذه صعبة. إذا تم استخدام finalizer للتأكد من التخلص من كائن، وهذا يخالف الواقع البروتوكول لأن أنماط المتاح تقول إن مثيل التخلص منها يجب بطرح ObjectDisposedException إذا تم استخدامه بعد التخلص منها.
جامع القمامة يقسم الأشياء إلى ثلاث مجموعات:
- تلك التي لا تزال على قيد الحياة, لأنه في الماضي التحقق من الجذور الإشارة موجودة خارج الصيغة النهائية الانتظار ؛
- تلك التي تحتاج إلى حذف لأنه لا متجذرة مرجع موجود في أي مكان ؛
- تلك التي تحتاج إلى وضع اللمسات الأخيرة لأن الجذور مرجع موجود في استكمال قائمة الانتظار ، ولكن في أي مكان آخر.