Diese Dokumentation wurde archiviert und wird nicht länger gepflegt.

Typen, die über systemeigene Ressourcen verfügen, sollten freigegeben werden können

     TypeName

TypesThatOwnNativeResourcesShouldBeDisposable

CheckId

CA1049

Kategorie

Microsoft.Design

Unterbrechende Änderung

NonBreaking

Ein Typ verweist auf ein System.IntPtr-Feld, ein System.UIntPtr-Feld oder ein System.Runtime.InteropServices.HandleRef-Feld, implementiert jedoch nicht System.IDisposable.

Diese Regel setzt voraus, dass in den Feldern IntPtr, UIntPtr und HandleRef Zeiger auf nicht verwaltete Ressourcen gespeichert werden. Typen, die nicht verwaltete Ressourcen zuordnen, müssen IDisposable implementieren, damit Aufrufer diese Ressourcen bei Bedarf freigeben und die Lebensdauer der Objekte verkürzen können, die diese Ressourcen enthalten.

Aufgabe des empfohlenen Entwurfsmusters zum Bereinigen nicht verwalteter Ressourcen ist, sowohl ein implizites als auch ein explizites Mittel zum Freigeben dieser Ressourcen bereitzustellen. Dazu dient die System.Object.Finalize-Methode bzw. die System.IDisposable.Dispose-Methode. Der Garbage Collector ruft die Finalize-Methode eines Objekts zu einem nicht genau festgelegten Zeitpunkt auf, nachdem festgestellt wurde, dass das Objekt nicht mehr erreichbar ist. Nach dem Aufruf von Finalize wird zur Freigabe des Objekts eine zusätzliche Garbage Collection benötigt. Die Dispose-Methode ermöglicht dem Aufrufer, Ressourcen bei Bedarf explizit freizugeben. Die Ressourcen werden dabei früher freigegeben als unter dem Garbage Collector. Nach dem Bereinigen der nicht verwalteten Ressourcen muss Dispose die System.GC.SuppressFinalize(System.Object)-Methode aufrufen, um dem Garbage Collector mitzuteilen, dass Finalize nicht mehr aufgerufen werden muss. Damit entfällt die zusätzliche Garbage Collection, und die Lebensdauer des Objekts wird verkürzt.

Um einen Verstoß gegen diese Regel zu korrigieren, implementieren Sie IDisposable.

Eine Warnung dieser Regel kann gefahrlos ausgeschlossen werden, wenn der Typ nicht auf eine nicht verwaltete Ressource verweist. Andernfalls sollten Sie keine Warnung dieser Regel ausschließen, denn wenn IDisposable nicht implementiert wird, kann dies dazu führen, dass nicht verwaltete Ressourcen unverfügbar oder nicht verwendet werden.

Im folgenden Beispiel wird ein Typ gezeigt, der IDisposable implementiert, um eine nicht verwaltete Ressource zu bereinigen.

using System;

namespace DesignLibrary
{
    public class UnmanagedResources : IDisposable
    {
        IntPtr unmanagedResource;
        bool disposed = false;

        public UnmanagedResources() 
        {
            // Allocate the unmanaged resource ...
        }

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

        protected virtual void Dispose(bool disposing)
        {
            if(!disposed)
            {
                if(disposing)
                {
                    // Release managed resources.
                }

                // Free the unmanaged resource ...

                unmanagedResource = IntPtr.Zero;

                disposed = true;
            }
        }

        ~UnmanagedResources()
        {
            Dispose(false);
        }
    }
}

Anzeigen: