Partager via


CA1001 : Les types qui possèdent des champs supprimables doivent être supprimables

TypeName

TypesThatOwnDisposableFieldsShouldBeDisposable

CheckId

CA1001

Catégorie

Microsoft.CSharp

Modification avec rupture

Sans rupture - Si le type n'est pas visible à l'extérieur de l'assembly.

Avec rupture - Si le type est visible à l'extérieur de l'assembly.

Cause

Une classe déclare et implémente un champ d'instance qui est un type System.IDisposable et elle n'implémente pas IDisposable.

Description de la règle

Une classe implémente l'interface IDisposable pour supprimer les ressources non managées qu'elle possède. Un champ d'instance qui est un type IDisposable indique que le champ possède une ressource non managée. Une classe qui déclare un champ IDisposable possède indirectement une ressource non managée et doit implémenter l'interface IDisposable. Si la classe ne possède pas directement de ressources non managées, elle ne doit pas implémenter de finaliseur.

Comment corriger les violations

Pour corriger une violation de cette règle, implémentez IDisposable et appelez la méthode IDisposable.Dispose du champ à partir de la méthode Dispose du champ.

Quand supprimer les avertissements

Ne supprimez aucun avertissement de cette règle.

Exemple

L'exemple suivant présente une classe qui viole la règle et une autre qui satisfait à la règle en implémentant IDisposable. La classe n'implémente pas de finaliseur car elle ne possède pas directement de ressources non managées.

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

Règles connexes

CA2213 : Les champs pouvant être supprimés doivent l'être

CA2216 : Les types pouvant être supprimés doivent déclarer un finaliseur

CA2215 : Les méthodes Dispose doivent appeler la fonction Dispose de la classe de base

CA1049 : Les types qui possèdent des ressources natives doivent être supprimables