Share via


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

Aktualisiert: November 2007

     TypeName

TypesThatOwnDisposableFieldsShouldBeDisposable

CheckId

CA1001

Kategorie

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 System.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.

Behandlung 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 einen Finalizer, da sie nicht direkt nicht verwaltete 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

Verwerfbare Felder sollten freigegeben werden

Verwerfbare Typen sollten einen Finalizer deklarieren

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