هل يجب استدعاء GC.SuppressFinalize على الكائنات التي لا تحتوي على أداة نهائية؟

StackOverflow https://stackoverflow.com/questions/621152

  •  05-07-2019
  •  | 
  •  

سؤال

لسبب ما يبدو أن شركة FXCop تفكر يجب أن أتصل بـ GC.SuppressFinalize في Dispose، بغض النظر عما إذا كان لدي أداة إنهاء أم لا.

هل فاتني شيء؟هل هناك سبب لاستدعاء GC.SuppressFinalize على الكائنات التي لم يتم تحديد أداة الإنهاء لها؟

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

المحلول

وهناك دائما finalizer في IL - System.Object.Finalize () موجود في كل فئة، لذلك إذا قمت بإجراء فئة مخصصة لها finalizer تريد قمع. أن يقال، لا يتم وضع كل الكائنات على قائمة انتظار وضع اللمسات الأخيرة، لذلك يمكنك فقط techncially أن الحاجة إلى قمع الانتهاء إذا قمت بتطبيق finalizer الخاص بك.

إذا كنت تنفيذ IDisposable التفاف الموارد غير المدارة، يجب أن تشمل finalizer، ويجب منع هذا من الترشح، لأنه في نظرية تفعلونه تنظيف بالفعل عندما يتم استدعاء Dispose.

نصائح أخرى

ليست هناك حاجة للاتصال GC.SuppressFinalize(this) في التخلص، ما لم:

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

أود أن أقول، بافتراض عدم وجود أي من الحالات المذكورة أعلاه، أنه يمكنك تجاهل هذه الرسالة بأمان.

وكافة الكائنات لديها أسلوب finalizer، حتى لو لم تكن قد نفذت واحدة باستخدام ج # المدمر (والذي لا يضمن في الواقع ليتم استدعاؤها من قبل GC). انها مجرد الممارسة الجيدة لتقمع الدعوة إذا طبقت IDisposable لأن ذلك يعني أنك قد قررت إجراء اللمسات الأخيرة explictly.

devx المقالة

وأنا لا أرى أي حاجة لاستدعاء SuppressFinalize () اذا لم يكن هناك finalizer محددة. إذا كنت تريد أن تكون دفاعية ثم يمكن أن تكون جيدة في الحصول على finalizer وكذلك التخلص ()، لذلك لا تحتاج إلى الاعتماد على العملاء للاتصال دائما تخلص (). فإنك لن تسرب الموارد عندما ينسى.

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