Поделиться через


CA1001: типы, которым принадлежат освобождаемые поля, должны быть освобождаемыми

TypeName

TypesThatOwnDisposableFieldsShouldBeDisposable

CheckId

CA1001

Категория

Microsoft.Design

Критическое изменение

Не критическое — если тип недоступен для кода за пределами сборки.

Критическое — если тип доступен для кода за пределами сборки.

Причина

В классе объявляется и реализуется поле экземпляра, которое принадлежит типу System.IDisposable, однако класс не реализует интерфейс IDisposable.

Описание правила

Класс реализует интерфейс IDisposable для удаления принадлежащих ему неуправляемых ресурсов. Принадлежность поля экземпляра типу IDisposable означает, что данное поле владеет неуправляемым ресурсом. Класс, в котором объявляется поле IDisposable, неявно владеет неуправляемым ресурсом и должен реализовывать интерфейс IDisposable. Если класс явным образом не владеет управляемыми ресурсами, он не должен реализовывать метод завершения.

Устранение нарушений

Чтобы устранить нарушение данного правила, реализуйте IDisposable и вызовите из метода IDisposable.Dispose метод Dispose поля.

Отключение предупреждений

Для этого правила отключать вывод предупреждений не следует.

Пример

В следующем примере показан класс, который нарушает данное правило, и класс, удовлетворяющий правилу благодаря реализации интерфейса IDisposable. Класс не реализует метод завершения, поскольку не владеет управляемыми ресурсами явным образом.

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

Связанные правила

CA2213: следует высвобождать высвобождаемые поля

CA2216: высвобождаемые типы должны объявлять метод завершения

CA2215: методы Dispose должны вызывать такие же методы базового класса

CA1049: типы, которым принадлежат собственные ресурсы, должны быть высвобождаемыми