CA2216: Verwerfbare Typen sollten einen Finalizer deklarieren

TypeName

DisposableTypesShouldDeclareFinalizer

CheckId

CA2216

Kategorie (Category)

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

Ursache

Ein Typ, der IDisposable implementiert und Felder besitzt, bei denen die Verwendung nicht verwalteter Ressourcen empfohlen wird, implementiert keinen Finalizer wie von Object.Finalize beschrieben.

Regelbeschreibung

Ein Verstoß gegen diese Regel wird gemeldet, wenn der verwerfbare Typ Felder folgender Typen enthält:

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie einen Finalizer, der die Dispose-Methode aufruft.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung dieser Regel kann gefahrlos unterdrückt werden, wenn der Typ nicht IDisposable implementiert, um nicht verwaltete Ressourcen freizugeben.

Beispiel

Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen diese Regel verstößt.

using System;  
using System.Runtime.InteropServices;

namespace UsageLibrary
{
    public class  DisposeMissingFinalize :IDisposable
    {
        private bool disposed = false;
        private IntPtr unmanagedResource;

        [DllImport("native.dll")]
        private static extern IntPtr AllocateUnmanagedResource();

        [DllImport("native.dll")]
        private static extern void FreeUnmanagedResource(IntPtr p);

        DisposeMissingFinalize()
        {
            unmanagedResource = AllocateUnmanagedResource();
        }

        protected virtual void Dispose(bool disposing) 
        {
            if (!disposed) 
            {
                // Dispose of resources held by this instance.
                FreeUnmanagedResource(unmanagedResource);
                disposed = true;

                // Suppress finalization of this disposed instance. 
                if (disposing)
                {
                    GC.SuppressFinalize(this);
                }
            }
        }

        public void Dispose()
        {
            Dispose(true);
        }

        // Disposable types with unmanaged resources implement a finalizer. 
        // Uncomment the following code to satisfy rule: 
        //  DisposableTypesShouldDeclareFinalizer 
        // ~TypeA() 
        // { 
        //     Dispose(false); 
        // }
    }
}

Verwandte Regeln

CA2115: GC.KeepAlive beim Verwenden systemeigener Ressourcen aufrufen

CA1816: GC.SuppressFinalize korrekt aufrufen

CA1049: Typen, die systemeigene Ressourcen besitzen, müssen gelöscht werden können

Siehe auch

Referenz

IDisposable

IntPtr

HandleRef

UIntPtr

Object.Finalize

Weitere Ressourcen

Implementing Finalize and Dispose