سؤال

عند استخدام الضعف، كيف يمكننا أن نكون متأكدين من الهدف لا يتم جمعها بين مكالمات .ISTIVE و.

علي سبيل المثال:

if (myWeakReference.IsAlive)
{
    // How can we be sure the object is still alive while here?
    ((MyType)myWeakReference.Target).Foo();
}
هل كانت مفيدة؟

المحلول

فقط الحصول على Target والتحقق مما إذا كان الأمر غير فارغ:

object target = myWeakReference.Target;
if (target != null)
{        
    ((MyType)target).Foo();
}

ال مستندات ل IsAlive يقول على وجه التحديد:

نظرا لأنه من المحتمل أن يتم استصلاح كائن لجمع القمامة مباشرة بعد إرجاع خصائص Isalive True، لا ينصح باستخدام هذه الخاصية إلا إذا كنت تختبر فقط لقيمة إرجاع خاطئة فقط.

نصائح أخرى

الغرض الوحيد الخاص بممتلكات "Isalive" هو المواقف التي تريد اتخاذ بعض الإجراءات إذا تم تدمير هدف الضعف بالفعل، ولكن حيث لا تريد المخاطرة بطريق الخطأ على قيد الحياة لفترة أطول من اللازم. إذا كان أحد يقول، على سبيل المثال

 إذا كان (ضخم.target == NULL) Cleanup_Related_Object ()؛

وجمع القمامة - كان مجمع القمامة (لأي سبب من الأسباب) يؤدي مباشرة بعد الكود الذي قام بتقييم ضابط ما إلى حد ما من ناحية أخرى، قائلا:

 إذا (! بعضها البعض.

لن يكون هناك خطر إطالة عمر هدف هدف ضخما

لا يمكنك ذلك. تعيين myWeakReference.Target إلى متغير، والتحقق من فارغ.

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