== Why is this an issue?

This rule raises an issue when a disposable type contains fields of the following types and does not implement a finalizer:

* ``++System.IntPtr++``
* ``++System.UIntPtr++``
* ``++System.Runtime.InteropService.HandleRef++``


=== Noncompliant code example

[source,csharp]
----
using System;
using System.Runtime.InteropServices;

namespace MyLibrary
{
  public class Foo : IDisposable // Noncompliant: Doesn't have a finalizer
  {
    private IntPtr myResource;
    private bool disposed = false;

    protected virtual void Dispose(bool disposing) 
    {
      if (!disposed) 
      {
        // Dispose of resources held by this instance.
        FreeResource(myResource);
        disposed = true;

        // Suppress finalization of this disposed instance.
        if (disposing)
        {
          GC.SuppressFinalize(this);
        }
      }
    }

    public void Dispose() {
      Dispose(true);
    }
  }
}
----


=== Compliant solution

[source,csharp]
----
using System;
using System.Runtime.InteropServices;

namespace MyLibrary
{
  public class Foo : IDisposable
  {
    private IntPtr myResource;
    private bool disposed = false;

    protected virtual void Dispose(bool disposing) 
    {
      if (!disposed) 
      {
        // Dispose of resources held by this instance.
        FreeResource(myResource);
        disposed = true;

        // Suppress finalization of this disposed instance.
        if (disposing)
        {
          GC.SuppressFinalize(this);
        }
      }
    }

    ~Foo()
    {
      Dispose(false);
    }
  }
}
----


== Resources

* Related: S3881 - "IDisposable" should be implemented correctly



ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Implement a finalizer that calls your "Dispose" method.


=== Highlighting

The class declaration


'''
== Comments And Links
(visible only on this page)

=== is related to: S3881

endif::env-github,rspecator-view[]
