Es wird empfohlen, Visual Studio 2017 zu verwenden
Diese Dokumentation wurde archiviert und wird nicht länger gepflegt.

Verwerfbare Typen sollten einen Finalizer deklarieren

Aktualisiert: November 2007

     TypeName

DisposableTypesShouldDeclareFinalizer

CheckId

CA2216

Kategorie

Microsoft.Usage

Unterbrechende Änderung

Nicht unterbrechend

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

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

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

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

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);
        // }
    }
}


Anzeigen: