다음을 통해 공유


삭제 가능한 필드가 있는 형식은 삭제 가능해야 합니다.

업데이트: 2007년 11월

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

관련 규칙

삭제 가능한 필드는 삭제해야 합니다.

삭제 가능한 형식은 종료자를 선언해야 합니다.

네이티브 리소스가 있는 형식은 삭제 가능해야 합니다.