CA2215:Dispose 方法應該呼叫基底類別處置
屬性 | 值 |
---|---|
規則識別碼 | CA2215 |
標題 | Dispose 方法應該呼叫基底類別處置 |
類別 | 使用方式 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 8 中啟用 | No |
原因
實作 System.IDisposable 的型別繼承自也實作 IDisposable 的型別。 Dispose繼承型別的 方法不會呼叫 Dispose 父型別的 方法。
檔案描述
如果型別繼承自可處置型別,則必須從自己的 Dispose 方法內呼叫 Dispose 基底型別的 方法。 呼叫基底類型 Dispose
方法可確保釋放基底類型所建立的任何資源。
如何修正違規
若要修正此規則的違規,請在 方法 Dispose 中呼叫 。 base
Dispose
隱藏警告的時機
如果對 的呼叫 base
Dispose 比規則檢查更深層次,隱藏此規則的警告是安全的。
隱藏警告
如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。
#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);
}
}
}
}