سؤال

هل من الأفضل حقًا عدم استخدام اللمسات الأخيرة على التخلص؟ هل التخلص من إزالة المورد غير المدير في أول تحليل؟

ما هو قمع اللمسات الأخيرة؟

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

المحلول

يجب أن يكون تنفيذك لـ Idisposable:

public MyClass : IDisposable
{
     public void Dispose() 
     {
         Dispose(true);
         GC.SuppressFinalize(this);
     }

     protected Dispose(bool disposing) 
     {
         if( disposing )
         {
             // release unmanaged resource
         }
         // release managed resources
     }

     ~MyClass() 
     {
         Dispose(false);
     }
}

إذا كان كائنًا يحتوي على نهائيات ، فإن CLR يحتفظ بالإشارة إليه في قائمة انتظار الانتهاء. إذا تخلصت من الكائن يدويًا (استدعاء Dispose ()) ، فأنت بالفعل تزيل الموارد غير المُدارة (حيث يتم مشاركة تنفيذ التخلص ونهائي) ، لذلك ليست هناك حاجة للاتصال بـ Finalizer ويمكنك إزالة الكائن بأمان من الانتهاء قائمة الانتظار (استدعاء gc.suppressFinalize (هذا)).

نصائح أخرى

كتبت منشور مدونة كيفية تنفيذ idisposable و النهائي: 3 قواعد سهلة هذا يصف في قدر لا بأس به من التفاصيل متى وكيفية استخدام كل منها. لدي أيضًا بعض الأسئلة والأجوبة حول هذا الموضوع.

وثائق Microsoft سيئة السمعة حول كيفية التنفيذ IDisposable (وقاعدة FXCOP المقابلة) عفا عليها الزمن بشكل فظيع. يصفون بدقة كيفية تنفيذ Microsoft IDisposable... في .NET 1.0. عندما خرج V2.0 ، تم إعادة تجهيز جميع الفصول الدراسية تقريبًا في BCL لمتابعة إرشادات مماثلة لتلك الموضحة في منشور مدونتي (الفرق الوحيد هو أن Microsoft يفعل لديك المحمية Dispose(bool) للدروس المصممة للاستخدام كطبقات أساسية). على وجه الخصوص ، لا توجد فئة BCL على حد علمي هي المسؤولة عن الموارد المدارة وغير المدارة.

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

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

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