CA2216: Disposable types should declare finalizer


The new home for Visual Studio documentation is Visual Studio 2017 Documentation on

The latest version of this topic can be found at CA2216: Disposable types should declare finalizer.

|Breaking Change|Non Breaking|

A type that implements System.IDisposable, and has fields that suggest the use of unmanaged resources, does not implement a finalizer as described by Object.Finalize.

A violation of this rule is reported if the disposable type contains fields of the following types:

To fix a violation of this rule, implement a finalizer that calls your Dispose method.

It is safe to suppress a warning from this rule if the type does not implement IDisposable for the purpose of releasing unmanaged resources.

The following example shows a type that violates this rule.

using System;  
using System.Runtime.InteropServices;

namespace UsageLibrary
    public class  DisposeMissingFinalize :IDisposable
        private bool disposed = false;
        private IntPtr unmanagedResource;
        private static extern IntPtr AllocateUnmanagedResource();
        private static extern void FreeUnmanagedResource(IntPtr p);
            unmanagedResource = AllocateUnmanagedResource();
        protected virtual void Dispose(bool disposing) 
            if (!disposed) 
                // Dispose of resources held by this instance.
                disposed = true;
                // Suppress finalization of this disposed instance.
                if (disposing)

        public void Dispose()

        // Disposable types with unmanaged resources implement a finalizer.
        // Uncomment the following code to satisfy rule:
        //  DisposableTypesShouldDeclareFinalizer
        // ~TypeA()
        // {
        //     Dispose(false);
        // }

CA2115: Call GC.KeepAlive when using native resources

CA1816: Call GC.SuppressFinalize correctly

CA1049: Types that own native resources should be disposable

Dispose Pattern