Condividi tramite


CA1001: I tipi proprietari di campi Disposable devono essere Disposable

TypeName

TypesThatOwnDisposableFieldsShouldBeDisposable

CheckId

CA1001

Category

Microsoft.Design

Breaking Change

Non sostanziale - Se il tipo non è visibile all'esterno dell'assembly.

Sostanziale - Se il tipo è visibile all'esterno dell'assembly.

Causa

Una classe dichiara e implementa un campo di istanza che corrisponde a un tipo System.IDisposable e la classe non implementa IDisposable.

Descrizione della regola

Una classe implementa l'interfaccia IDisposable per eliminare le risorse non gestite di cui è proprietaria. Un campo di istanza che corrisponde a un tipo IDisposable indica che il campo è proprietario di una risorsa non gestita. Una classe che dichiara un campo IDisposable è indirettamente proprietaria di una risorsa non gestita e dovrebbe implementare l'interfaccia IDisposable. Se la classe non è direttamente proprietaria di risorse non gestite, non dovrebbe implementare un finalizzatore.

Come correggere le violazioni

Per correggere una violazione di questa regola, implementare IDisposable e dal metodo IDisposable.Dispose chiamare il metodo Dispose del campo.

Esclusione di avvisi

Non escludere un avviso da questa regola.

Esempio

Nell'esempio riportato di seguito vengono illustrate due classi: una che viola la regola e una che la soddisfa mediante l'implementazione di IDisposable. La classe non implementa un finalizzatore in quanto non è direttamente proprietaria di risorse non gestite.

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

Regole correlate

CA2213: I campi Disposable devono essere eliminati

CA2216: I tipi Disposable devono dichiarare un finalizzatore

CA2215: I metodi Dispose devono chiamare il metodo Dispose della classe base

CA1049: I tipi delle risorse native devono essere Disposable