ca1063: قم بتطبيق IDisposable بشكل صحيح

TypeName

ImplementIDisposableCorrectly

CheckId

ca1063

Category

Microsoft.تصميم

تعطيل تغيير

غير فاصلة

السبب

IDisposableهو غير مطبقة بشكل صحيح. يتم هنا سرد بعض الأسباب لهذه المشكلة:

  • IDهوposable هو re-implemented في فئة.

  • إنهاء هو re-overridden.

  • Dهوpose هو تجاوزها.

  • Dهوpose() هو Dهوpose غير العامة مختوم أو مسمى.

  • Dispose(bool) غير محمية أو ظاهري unsealed.

  • في أنواع unsealed، يجب استدعاء Dispose() Dispose(صواب).

  • أنواع unsealed، تطبيق Finalize لن باستدعاء أما أداة الإنهاء في حالة فئة أو كلاهما Dispose(bool).

سيتم تشغيل انتهاكا لأي من هذه النقوش هذا التحذير.

يجب أن يوفر كل جذر unsealed IDisposable نوع خاص به محمي خالية Dispose(bool) أسلوب ظاهري. يجب استدعاء Dispose() Dipose(صواب) و Finalize يجب استدعاء Dispose(خطأ). إذا كنت تقوم بإنشاء جذر unsealed نوع IDisposable، يجب تعريف Dispose(bool) و تسميته.

وصف القاعدة

يجب تطبيق الجميع أنواع IDisposable نقش تخلص بشكل صحيح.

كيف إلى الإصلاح انتهاكات

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

  • إزالة IDisposable من قائمة الواجهات المطبقة بواسطة {0} وتجاوز التطبيق تخلص فئة Base بدلاً من ذلك.

  • قم بإزالة أداة الإنهاء من النوع {0}، ويمنع Dهوpose (dهوposing منطقي)، ثم قم بوضع المنطق الإنهاء في مسار رمز فيه 'dهوposing' هو خاطئة.

  • إزالة {0}، ويمنع Dهوpose (dهوposing منطقي)، ثم قم بوضع المنطق dهوpose في مسار رمز فيه 'dهوposing' هو صحيحاً.

  • تأكد من أن {0} هو تعريف كعامة ومغلقة.

  • إعادة تسمية {0} 'Dهوpose' والتأكد من أنه هو تعريف كعامة ومغلقة.

  • تأكد من أن {0} هو تم تعريفه كمحمية، الظاهرية، و unsealed.

  • تعديل {0}، لذلك قم باستدعاء Dispose(صواب)، ثم قم باستدعاء GC.SuppressFinalize في مثيل الكائن الحالي ('this' أو 'Me' في Visual أساسى)، و ثم إرجاع.

  • تعديل {0} بحيث يقوم باستدعاء Dispose(خطأ) و ثم إرجاع.

  • في حالة كتابة جذر unsealed الفئة IDisposable، تأكد من أن تنفيذ IDisposable يتبع نمط الموضحة أعلاه.

عند إلى منع التحذيرات

لا بمنع تحذير من هذه قاعدة.

مثال pseudo-تعليمات برمجية

pseudo-تعليمات برمجية التالية توفير مثال عامة كيف ينبغي تنفيذ Dispose(bool) في فئة إدارة استخدامات و موارد الأصلي:

public class Resource : IDisposable 
{
    private IntPtr nativeResource = Marhsal.AllocHGlobal(100);
    private AnotherResource managedResource = new AnotherResource();

// Dispose() calls Dispose(true)
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    // NOTE: Leave out the finalizer altogether if this class doesn't 
    // own unmanaged resources itself, but leave the other methods
    // exactly as they are. 
    ~Resource() 
    {
        // Finalizer calls Dispose(false)
        Dispose(false);
    }
    // The bulk of the clean-up code is implemented in Dispose(bool)
    protected virtual void Dispose(bool disposing)
    {
        if (disposing) 
        {
            // free managed resources
            if (managedResource != null)
            {
                managedResource.Dispose();
                managedResource = null;
            }
        }
        // free native resources if there are any.
        if (nativeResource != IntPtr.Zero) 
        {
            Marshal.FreeHGlobal(nativeResource);
            nativeResource = IntPtr.Zero;
        }
    }
}