Finalizer sollten Basisklassen-Finalizer aufrufen

     TypeName

FinalizersShouldCallBaseClassFinalizer

CheckId

CA2220

Kategorie

Microsoft.Usage

Unterbrechende Änderung

NonBreaking

Ursache

Ein Typ, der System.Object.Finalize überschreibt, ruft die Finalize-Methode in seiner Basisklasse nicht auf.

Regelbeschreibung

Der Abschluss muss durch die Vererbungshierarchie weitergegeben werden. Um dies sicherzustellen, müssen die Typen die Finalize-Methode ihrer Basisklasse innerhalb ihrer eigenen Finalize-Methode aufrufen. Der C#-Compiler fügt den Aufruf automatisch dem Basisklassenfinalizer hinzu.

Behandlung von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, rufen Sie die Finalize-Methode des Basistyps in der Finalize-Methode auf.

Warnungsausschluss

Schließen Sie keine Warnung dieser Regel aus. Einige Compiler, die auf die Common Language Runtime abzielen, fügen in die Microsoft Intermediate Language (MSIL) einen Aufruf des Finalizers des Basistyps ein. Wenn eine Warnung dieser Regel gemeldet wird, fügt der Compiler den Aufruf nicht ein, sodass Sie ihn in Ihren Code einfügen müssen.

Beispiel

Das folgende Visual Basic-Beispiel zeigt den Typ TypeB, durch den die Finalize-Methode in seiner Basisklasse ordnungsgemäß aufgerufen wird.

Imports System
Imports UsageLibrary

Namespace UsageLibrary

Public Class TypeB
   Inherits TypeA
     
   Protected Overrides Sub Dispose(disposing As Boolean)

      Try 
         If disposing Then
         
            ' dispose managed resources
         
         End If
         
            ' free native resources

      Finally
         
         ' satisfies rule: DisposeMethodsShouldCallBaseClassDispose
         MyBase.Dispose(disposing)

      End Try 

   End Sub 'Dispose
   
End Class 'TypeB

End Namespace
using System;  

namespace UsageLibrary
{
   public class  TypeB : TypeA
   {
      protected override void Dispose(bool disposing) 
      {

        try

        {
           if (disposing) 
           {
              // Dispose managed resources

           }

           // free native resources

        }

        finally

        {
            // Satisfies rule: DisposeMethodsShouldCallBaseClassDispose.
            base.Dispose(disposing);
        }
      }

  }
}

Siehe auch

Referenz

Implementieren der Methoden "Finalize" und "Dispose" zum Bereinigen von nicht verwalteten Ressourcen