次の方法で共有


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: ネイティブ リソースを所有する型は、破棄可能でなければなりません