Dispose methods should call base class dispose

TypeName

DisposeMethodsShouldCallBaseClassDispose

CheckId

CA2215

Category

Microsoft.Usage

Breaking Change

NonBreaking

Cause

A type that implements System.IDisposable inherits from a type that also implements IDisposable. The Dispose method of the inheriting type does not call the Dispose method of the parent type.

Rule Description

If a type inherits from a disposable type, it must call the Dispose method of the base type from within its own Dispose method.

How to Fix Violations

To fix a violation of this rule, call base.Dispose in your Dispose method.

When to Exclude Warnings

It is safe to exclude a warning from this rule if the call to base.Dispose occurs at a deeper calling level than the rule checks.

Example

The following example shows a type TypeA that implements IDisposable.

using System;  

namespace UsageLibrary
{
    public class  TypeA :IDisposable
    {
     
        protected virtual void Dispose(bool disposing) 
        {
            if (disposing) 
            {
                // Dispose managed resources
            }

            // Free native resources
        }

        public void Dispose()
        {

                Dispose(true);

                GC.SuppressFinalize(this);

        }

        // Disposable types implement a finalizer.
        ~TypeA()
        {
            Dispose(false);
        }
    }
}

The following example shows a type TypeB that inherits from type TypeA and correctly calls its Dispose method.

Imports System

Namespace UsageLibrary

    Public Class TypeB
        Inherits TypeA

        Friend Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                Dispose(False)
            Finally
                MyBase.Finalize()
            End Try
        End Sub 'Dispose
    End Class 'TypeB

End Namespace

See Also

Reference

Implementing Finalize and Dispose to Clean Up Unmanaged Resources
System.IDisposable