Share via


CA2215:Dispose 方法應該呼叫基底類別處置

屬性
規則識別碼 CA2215
標題 Dispose 方法應該呼叫基底類別處置
類別 使用方式
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 No

原因

實作 System.IDisposable 的型別繼承自也實作 IDisposable 的型別。 Dispose繼承型別的 方法不會呼叫 Dispose 父型別的 方法。

檔案描述

如果型別繼承自可處置型別,則必須從自己的 Dispose 方法內呼叫 Dispose 基底型別的 方法。 呼叫基底類型 Dispose 方法可確保釋放基底類型所建立的任何資源。

如何修正違規

若要修正此規則的違規,請在 方法 Dispose 中呼叫 。 baseDispose

隱藏警告的時機

如果對 的呼叫 baseDispose 比規則檢查更深層次,隱藏此規則的警告是安全的。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

#pragma warning disable CA2215
// The code that's violating the rule is on this line.
#pragma warning restore CA2215

若要停用檔案、資料夾或專案的規則,請在組態檔 中將其嚴重性設定為 。 none

[*.{cs,vb}]
dotnet_diagnostic.CA2215.severity = none

如需詳細資訊,請參閱 如何隱藏程式碼分析警告

範例

下列範例示範實作 IDisposable 的兩種型別, TypeA 以及 TypeB 繼承自 型 TypeA 別並正確地呼叫其 Dispose 方法。

Namespace ca2215

    Public Class TypeA
        Implements IDisposable

        Protected Overridable Overloads Sub Dispose(disposing As Boolean)
            If disposing Then
                ' dispose managed resources
            End If
            
            ' free native resources
        End Sub

        Public Overloads Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub

        ' Disposable types implement a finalizer.
        Protected Overrides Sub Finalize()
            Dispose(False)
            MyBase.Finalize()
        End Sub

    End Class

    Public Class TypeB
        Inherits TypeA

        Protected Overrides Sub Dispose(disposing As Boolean)
            If Not disposing Then
                MyBase.Dispose(False)
            End If
        End Sub

    End Class

End Namespace
using System;

namespace ca2215
{
    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);
        }
    }

    public class TypeB : TypeA
    {
        protected override void Dispose(bool disposing)
        {
            if (!disposing)
            {
                base.Dispose(false);
            }
        }
    }
}

另請參閱