كيفية تنفيذ نمط التخلص بطريقة الإغلاق بشكل صحيح (CA1063)

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

  •  08-07-2019
  •  | 
  •  

سؤال

تقول إرشادات تصميم الإطار (الطبعة الثانية، الصفحة 327):

النظر في توفير الطريقة Close(), ، بالإضافة الى Dispose(), ، إذا كان الإغلاق هو المصطلح القياسي في المنطقة.

عند القيام بذلك، من المهم أن تجعل تطبيق Close مطابقًا لـ Dispose والنظر في التنفيذ IDisposable.Dispose الطريقة صراحة.

لذا، باتباع المثال المقدم، لدي هذا الفصل:

public class SomeClass : IDisposable {
    private SomeDisposable someInnerDisposable;

    public void Open() {
        this.someInnerDisposable = new SomeDisposable();
    }

    void IDisposable.Dispose() {
        this.Close();
    }

    public void Close() {
        this.Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing) {
        if (disposing) {
            this.someInnerDisposable.Dispose();
            this.someInnerDisposable = null;
        }
    }
}

يبدو أن FxCop لا تحب ذلك:

CA1816 :مايكروسوفت. الاستخدام:يستدعي 'SomeClass.Close()' 'GC.SuppressFinalize(object)'، وهي طريقة يتم استدعاؤها عادةً فقط ضمن تطبيق 'IDisposable.Dispose'.راجع نمط IDisposable لمزيد من المعلومات.

CA1816 :مايكروسوفت. الاستخدام:قم بتغيير "SomeClass.IDisposable.Dispose()" للاتصال بـ "GC.SuppressFinalize(object)".سيؤدي هذا إلى منع الانتهاء غير الضروري من الكائن بمجرد التخلص منه وخروجه عن النطاق.

CA1063 :مايكروسوفت. التصميم :تعديل 'SomeClass.IDisposable.Dispose()' بحيث يستدعي Dispose(true)، ثم يستدعي GC.SuppressFinalize على مثيل الكائن الحالي ('this' أو 'Me' في Visual Basic)، ثم يعود.

CA1063 :مايكروسوفت. التصميم :أعد تسمية "SomeClass.IDisposable.Dispose()" إلى "Dispose" وتأكد من إعلانه عامًا ومختومًا.

  • كيف أقوم بتنفيذ نمط التخلص بطريقة الإغلاق بشكل صحيح؟

-أو-

  • كيف يمكنني منع التحذيرات؟

حاولت

[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
    Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
    this.Close();
}

لكن FxCop 1.36 لا يزال يبلغ عنها.

يحرر:يؤدي تغييره كما هو مقترح إلى إزالة كل شيء باستثناء هذا التحذير:

CA1063 :مايكروسوفت. التصميم :أعد تسمية "SomeClass.IDisposable.Dispose()" إلى "Dispose" وتأكد من إعلانه عامًا ومختومًا.

تحرير 2:كان CODE_ANALYSIS مفقودًا بالفعل.شكرًا.

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

المحلول

تغييره حولها.

اطلب من Close() استدعاء this.Dispose() ووضع المنطق في طريقة Dispose() بدلاً من طريقة Close().

------------------- مزيد من المعلومات بعد التعديل ---------------

وكذلك تغيير التصريح إلى:

public void Dispose()

يجب التخلص من الخطأ الآخر.منذ أن قمت بإعلانها على النحو التالي:

void IDisposable.Dispose()

لم يتم وضع علامة عليه على أنه عام ومختوم، وتشكو FxCop.أنا شخصياً أفضل تجنب الأخطاء بدلاً من قمعها.

نصائح أخرى

كيف يمكنني منع التحذيرات؟

يعمل SuppressMessage() فقط عند تحديد علامة CODE_ANALYSIS كرمز ترجمة شرطي.

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