Freigeben über


CA1001: Typen, die löschbare Felder besitzen, müssen gelöscht werden können

TypeName

TypesThatOwnDisposableFieldsShouldBeDisposable

CheckId

CA1001

Kategorie (Category)

Microsoft.Design

Unterbrechende Änderung

Nicht unterbrechend – Wenn der Typ nicht außerhalb der Assembly sichtbar ist.

Unterbrechend – Wenn der Typ außerhalb der Assembly sichtbar ist.

Ursache

Eine Klasse deklariert und implementiert ein Instanzenfeld, das den IDisposable-Typ aufweist, implementiert jedoch IDisposable nicht.

Regelbeschreibung

Eine Klasse implementiert die IDisposable-Schnittstelle, um nicht verwaltete Ressourcen, die sie besitzt, zu entfernen.Ein Instanzenfeld, das den IDisposable-Typ aufweist, gibt an, dass das Feld eine nicht verwaltete Ressource besitzt.Eine Klasse, die ein IDisposable-Feld deklariert, besitzt indirekt eine nicht verwaltete Ressource und sollte die IDisposable-Schnittstelle implementieren.Wenn die Klasse keine nicht verwalteten Ressourcen direkt besitzt, sollte sie keinen Finalizer implementieren.

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, implementieren Sie IDisposable, und rufen Sie in der IDisposable.Dispose-Methode die Dispose-Methode des Felds auf.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Beispiel

Das folgende Beispiel zeigt eine Klasse, die gegen die Regel verstößt, und eine Klasse, die der Regel durch die Implementierung von IDisposable entspricht.Die Klasse implementiert keinen Finalizer, da sie direkt keine nicht verwalteten Ressourcen besitzt.

Imports System
Imports System.IO

Namespace DesignLibrary

   ' This class violates the rule. 
   Public Class NoDisposeMethod

      Dim newFile As FileStream

      Sub New()
         newFile = New FileStream("c:\temp.txt", FileMode.Open)
      End Sub 

   End Class 

   ' This class satisfies the rule. 
   Public Class HasDisposeMethod 
      Implements IDisposable

      Dim newFile As FileStream

      Sub New()
         newFile = New FileStream("c:\temp.txt", FileMode.Open)
      End Sub 

      Overloads Protected Overridable Sub Dispose(disposing As Boolean)

         If disposing Then 
            ' dispose managed resources
            newFile.Close()
         End If 

         ' free native resources 

      End Sub 'Dispose


      Overloads Public Sub Dispose() Implements IDisposable.Dispose

         Dispose(True)
         GC.SuppressFinalize(Me)

      End Sub 'Dispose

   End Class 

End Namespace
using System;
using System.IO;

namespace DesignLibrary
{
   // This class violates the rule. 
   public class NoDisposeMethod
   {
      FileStream newFile;

      public NoDisposeMethod()
      {
         newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
      }
   }

   // This class satisfies the rule. 
   public class HasDisposeMethod: IDisposable
   {
      FileStream newFile;

      public HasDisposeMethod()
      {
         newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
      }

      protected virtual void Dispose(bool disposing)
      {
         if (disposing)
            {
               // dispose managed resources
               newFile.Close();
            }
          // free native resources
      }

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

Verwandte Regeln

CA2213: Verwerfbare Felder verwerfen

CA2216: Verwerfbare Typen sollten einen Finalizer deklarieren

CA2215: Dispose-Methoden müssen die Dispose-Funktion der Basisklasse aufrufen

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