Udostępnij za pośrednictwem


CA1001: Typy, które posiadają pola usuwalne, powinny być usuwalne

TypeName

TypesThatOwnDisposableFieldsShouldBeDisposable

CheckId

CA1001

Kategoria

Microsoft.Design

Zmiana kluczowa

Niekluczowa - Jeśli typ nie jest widoczny na zewnątrz zestawu.

Kluczowa - Jeśli typ jest widoczny na zewnątrz zestawu.

Przyczyna

Klasa deklaruje i implementuje wystąpienie pola, które jest typu IDisposable i klasa nie implementuje IDisposable.

Opis reguły

Klasa implementuje interfejs IDisposable aby zlikwidować niezarządzane zasoby, które do niej należą.Pole wystąpienia, które jest typu IDisposable wskazuje, że to pole posiada niezarządzane zasoby.Klasa, która pośrednio deklaruje pole IDisposable posiada niezarządzane zasoby i powinna implementować interfejs IDisposable.Jeśli klasa nie posiada bezpośrednio niezarządzanych zasobów, nie powinna implementować finalizatora.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, zaimplementuj IDisposable i w metodzie IDisposable.Dispose wywołaj metodę Dispose pola.

Kiedy pominąć ostrzeżenia

Nie pomijaj ostrzeżeń dla tej reguły.

Przykład

Poniższy przykład pokazuje klasę, która narusza regułę i klasę, która zaspokaja regułę przez implementację IDisposable.Klasa nie implementuje finalizatora ponieważ klasa nie posiada bezpośrednio żadnych niezarządzanych zasobów.

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

Powiązane reguły

CA2213: Pola usuwalne powinny zostać usunięte

CA2216: Typy usuwalne powinny deklarować finalizator

CA2215: Metody Dispose powinny wywoływać operację usuwania klasy podstawowej

CA1049: Typy, które posiadają natywne zasoby powinny być usuwalne