Sdílet prostřednictvím


CA1001: Typy, které vlastní uvolnitelné pole by měly být uvolnitelné

Název_typu

TypesThatOwnDisposableFieldsShouldBeDisposable

CheckId

CA1001

Kategorie

Microsoft.design

Změnit rozdělení

Bez konce - Pokud je typ není viditelný vně sestavení.

Rozdělení - Pokud je typ viditelné mimo sestavení.

Příčina

Třída prohlašuje a implementuje instanci pole, které je IDisposable typu a třídy neimplementuje IDisposable.

Popis pravidla

Třída implementuje IDisposable rozhraní nakládat nespravované prostředky, které vlastní.Pole instance, který je IDisposable typu označuje, že pole vlastní nespravované prostředku.Třída, která prohlašuje, IDisposable pole nepřímo vlastní nespravované prostředek a plnit IDisposable rozhraní.Pokud třída není vlastníkem přímo jakékoli nespravované prostředky, by neměly implementovat finalizačních metod.

Jak opravit porušení

Porušení tohoto pravidla opravíte implementovat IDisposable a z IDisposable.Dispose volání metody Dispose metoda pole.

Při potlačení upozornění

Nepotlačovat upozornění od tohoto pravidla.

Příklad

Následující příklad ukazuje třídy, která porušují pravidlo a třídy, která splňuje pravidla implementací IDisposable.Třídy finalizačních metod neimplementuje, protože třída nevlastní přímo jakékoli nespravované prostředky.

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

Souvisejících pravidel

CA2213: Uvolnitelné pole by mělo být uvolněno

CA2216: Uvolnitelné typy by měly deklarovat finalizační metodu

CA2215: Metody Dispose by měly volat uvolnění třídy Base

CA1049: Typy, které vlastní nativní prostředky by měly být uvolnitelné