سؤال

يمكنني استخدام الافتراضي IDisposable تنفيذ القالب (نمط) على قانون بلدي.

مقتطف:

public void Dispose()
{
    Dispose(true);

    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool isDisposing)
{
    if (!this.disposed)
    {
        if (isDisposing)
        {
            //cleanup managed resources
        }

        //cleanup unmanaged resources

        this.disposed = true;
    }
}

سؤالي:لماذا الدعوة "GC.SuppressFinalize(هذا)" في التخلص العام الأسلوب ؟ وأود أن وضع "GC.SuppressFinalize(هذا)" في "إذا كان (isDisposing)" قسم حماية الأسلوب ، بعد التخلص الموارد المدارة.

مثل هذا:

protected virtual void Dispose(bool isDisposing)
{
    if (!this.disposed)
    {
       if (isDisposing)
       {
           //cleanup managed resources

           GC.SuppressFinalize(this);
       }

       //cleanup unmanaged resources

       this.disposed = true;
    }
}
هل كانت مفيدة؟

المحلول

أفترض حالة واضحة من قالب تصميم نمط.

مجردة تصميم فئة أن تأخذ الرعاية من كل المهمة/المهام الضرورية المطلوبة (هنا ، GC.SuppressFinalize(هذا)) ، والسماح فئة مشتقة لتجاوز فقط جزء من التعليمات البرمجية.

هناك 2 الحالات هنا:
مقتطف 1, SuppressFinalize في التصرف
مقتطف 2, SuppressFinalize في التصرف(صحيح)

هنا مقتطف 1, يجعل التأكد من أن GC.SuppressFinalize دائما تنفيذها.في حين مقتطف 2 يترك تنفيذ GC.SuppressFinalize في رحمة فئة مشتقة.

لذلك ، من خلال وضع GC.SuppressFinalize في أسلوب التخلص أنت كمصمم صفك دائما تأكد من أن بغض النظر عن أي قانون مكتوب من قبل الفئات المشتقة ، GC.SuppressFinalize سيتم تنفيذها.

هذا هو فائدة الكتابة SuppressFinalize في التصرف بدلا من التصرف(صحيح).

نصائح أخرى

وطريقة Dispose(bool isDisposing) ليس جزءا من IDisposable واجهة.

وأنت سيدعو عادة Dispose(true) من Dispose طريقة، ودعوة Dispose(false) من finalizer الخاص بك، وذلك للتراجع في حالة حيث لم يكن قد تم التخلص الكائن.

وكانت دعوته SuppressFinalize يروي GC أنه لا يوجد تحتاج إلى استدعاء finalizer الكائن الخاص بك، ويفترض أنه تم القيام به كل ما تبذلونه من تنظيف عندما كان يسمى Dispose.

إذا لم يكن لديك finalizer على الطبقة الخاصة بك، فإنك لا تحتاج إلى استدعاء SuppressFinalize على الإطلاق، لأن ليس هناك finalizer لقمع!

وجو دافي لديه بعض على التخلص منها، ووضع اللمسات الأخيرة، وجمع القمامة وغيرها .

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

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

والسبب هو عندما .Dispose التعليمات البرمجية المدارة (الشفرة) يتصرف في الكائن وبالتالي يختارون من وضع اللمسات الأخيرة. الناس عادة ما تخلق طريقا آخر إلى التخلص (منطقي بالتصرف) عن طريق finaliser وأن الدعوة لا تجعل أي معنى للfinaliser لجعل.

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

اقتباس:

// NOTE: Leave out the finalizer altogether if this class doesn't 
// own unmanaged resources itself, but leave the other methods
// exactly as they are. 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top