Share via


CA1001:具有可释放字段的类型应该是可释放的

类型名

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 方法应调用基类的 Dispose

CA1049:拥有本机资源的类型应是可释放的