[C#] منذ .NET لديها جامع القمامة لماذا نحتاج النهائي / المدمرات / التخلص من نمط؟


Answers

الإجابات السابقة جيدة ولكن اسمحوا لي أن أؤكد على نقطة هامة هنا مرة أخرى. على وجه الخصوص، قلت ذلك

إذا كنت أفهم بشكل صحيح .net وقت التشغيل سوف تنظيف دائما بعد لي.

هذا صحيح جزئيا فقط. في الواقع، يوفر .NET فقط إدارة تلقائية لمورد معين واحد : الذاكرة الرئيسية. جميع الموارد الأخرى تحتاج التنظيف اليدوي. 1)

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

1) الحل المعتادة محاولة هو إطالة عمر الموارد الأخرى إلى عمر مواقع الذاكرة أو المعرفات في التعليمات البرمجية - وبالتالي وجود النهائية.

Question

إذا كنت أفهم بشكل صحيح .net وقت التشغيل سوف تنظيف دائما بعد لي. لذلك إذا قمت بإنشاء كائنات جديدة وأوقف الرجوع إليها في بلدي التعليمات البرمجية، فإن وقت التشغيل تنظيف تلك الكائنات وتحرير الذاكرة التي احتلتها.

لأن هذا هو السبب لماذا ثم بعض الكائنات تحتاج إلى ديستروكتور أو التخلص من الطريقة؟ لن تنظيف وقت التشغيل بعد لهم عندما لم يتم الرجوع إليها بعد الآن؟




يتعرف جامع القمامة .NET كيفية التعامل مع الكائنات المدارة ضمن وقت تشغيل .NET. ولكن يتم استخدام نمط الترحيل (إديسبوسابل) في المقام الأول للكائنات غير المدارة التي يستخدمها التطبيق.

وبعبارة أخرى، فإن وقت تشغيل .NET لا يعرف بالضرورة كيفية التعامل مع كل نوع من الأجهزة أو التعامل معها (إغلاق اتصالات الشبكة، ومقابض الملفات، وأجهزة الرسومات، الخ)، وذلك باستخدام إديسبوسابل يوفر وسيلة ل "اسمحوا لي تنفيذ بعض تنظيف بلدي "في نوع. رؤية هذا التنفيذ، يمكن لجمع القمامة استدعاء ديسبوس () والتأكد من أن الأمور خارج كومة إدارة يتم تنظيفها.




  1. هناك أشياء جامع القمامة لا يمكن تنظيف بعد لك
  2. حتى مع الأشياء التي يمكن تنظيف، يمكنك مساعدته على تنظيف عاجلا



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




التفسير التبسيطي:

  • تم تصميم التخلص للتخلص الحتمي للموارد غير الذاكرة، وخاصة الموارد الشحيحة . على سبيل المثال، مقبض نافذة أو اتصال قاعدة بيانات.
  • تم تصميم اللمسات النهائية للتخلص غير الحتمي للموارد غير الذاكرة، وعادة ما تكون مساندة إذا لم تسمى تخلص.

بعض الإرشادات لتنفيذ طريقة الإنهاء:

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

بعض المبادئ التوجيهية لتنفيذ طريقة التخلص:

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



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

لذلك، بشكل عام، لن تحتاج إلى استخدام نمط ديسبوس / فيناليز إلا إذا كنت تستخدم الموارد غير المدارة.