سؤال

أثناء الاطلاع على وثائق المؤقت جريت عبر المثال التالي مع هذا التعليق: Genacodicetagpre

هل هذا يعني أنه يُسمح لـ GC في C # بجمع المتغيرات المحلية القمامة حتى لو كان لها آثار جانبية؟ربما لأنني لا أصل إلى المؤقت بعد ذلك مرة أخرى ، يمكن لـ GC جمعه مسبقًا؟

لست متأكدًا من أنني معجب بمثل هذا التحسين إذا فهمت ذلك بشكل صحيح (ولكن ربما لا أفهم ذلك ؛))

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

المحلول

نعم ، قد يجمع GC المتغير المحلي قبل إنهاء النطاق ، بمجرد آخر استخدام للمتغير.يضمن وضع GC.KeepAlive في نهاية الطريقة أن المتغير سيكون "حيًا" حتى استدعاء KeepAlive.

C # هي لغة ضرورية لذلك لم يتم تصميم GC لمعرفة أي شيء عن الآثار الجانبية.

نصائح أخرى

بقدر ما أفهم من GC ، فإنها ستحدد أي متغير أو كائن يعتقد أنه لم تعد هناك حاجة إليه كمرشح لجمع القمامة خلال دورة GC التالية.لست متأكدًا من أنني أفهم التطبيق المحدد هنا ، لكنني أعلم أن هناك حالات قد تحدد فيها GC موردًا للتجميع عندما لا تزال هناك حاجة إليه (ولكن لا يظهر ذلك بسبب الطريقة التي تتم بها كتابة الكود).

عادةً ، أثناء العمليات ، يظل الكائن أو المتغير في النطاق طوال مدة استدعاء الأسلوب ، ولكن إذا استمرت استدعاء الطريقة لفترة أطول من الوقت بين دورات GC ، فقد يرى GC كائن Timer الخاص بك على أنه خارج النطاق ويضع علامةمن أجل الجمع.تؤدي إضافة طريقة GC.KeepAlive إلى إجبار GC على الانتظار حتى تنتهي الطريقة قبل العمل على كائن Timer.

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