Udostępnij za pośrednictwem


CA1001: Typy, które własne pola jednorazowe powinna być jednorazowe

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 System.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: Winny być usuwane jednorazowe pól

CA2216: Typy jednorazowych należy zadeklarować finalizatorów

CA2215: Metody zbycia powinna wywołać zbycia klasy podstawowej

CA1049: Typy, które macierzystych środków własnych powinna być jednorazowe