CA1001: Types that own disposable fields should be disposable

Note

This article applies to Visual Studio 2015. If you're looking for Visual Studio 2017 documentation, use the version selector at the top left. We recommend upgrading to Visual Studio 2017. Download it here.

TypeName TypesThatOwnDisposableFieldsShouldBeDisposable
CheckId CA1001
Category Microsoft.Design
Breaking Change Non-breaking - If the type is not visible outside the assembly.

Breaking - If the type is visible outside the assembly.

Cause

A class declares and implements an instance field that is a System.IDisposable type and the class does not implement IDisposable.

Rule Description

A class implements the IDisposable interface to dispose of unmanaged resources that it owns. An instance field that is an IDisposable type indicates that the field owns an unmanaged resource. A class that declares an IDisposable field indirectly owns an unmanaged resource and should implement the IDisposable interface. If the class does not directly own any unmanaged resources, it should not implement a finalizer.

How to Fix Violations

To fix a violation of this rule, implement IDisposable and from the System.IDisposable.Dispose method call the Dispose method of the field.

When to Suppress Warnings

Do not suppress a warning from this rule.

Example

The following example shows a class that violates the rule and a class that satisfies the rule by implementing IDisposable. The class does not implement a finalizer because the class does not directly own any unmanaged resources.

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

CA2213: Disposable fields should be disposed

CA2216: Disposable types should declare finalizer

CA2215: Dispose methods should call base class dispose

CA1049: Types that own native resources should be disposable