CA2215:Dispose 方法應該呼叫基底類別處置
屬性 | 值 |
---|---|
規則識別碼 | CA2215 |
職稱 | Dispose 方法應該呼叫基底類別處置 |
類別 | 使用方式 |
修正程式是中斷或非中斷 | 不中斷 |
預設在 .NET 9 中啟用 | No |
原因
實作 System.IDisposable 的型別繼承自也實作 IDisposable的型別。 Dispose繼承型別的 方法不會呼叫Dispose父型別的 方法。
檔案描述
如果型別繼承自可處置型別,則必須從自己的 Dispose 方法內呼叫Dispose基底型別的 方法。 呼叫基底類型 Dispose
方法可確保釋放基底類型所建立的任何資源。
如何修正違規
若要修正此規則的違規,請在 方法base
中呼叫 。DisposeDispose
隱藏警告的時機
如果對的呼叫base
Dispose比規則檢查更深層次,隱藏此規則的警告是安全的。
隱藏警告
如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。
#pragma warning disable CA2215
// The code that's violating the rule is on this line.
#pragma warning restore CA2215
[*.{cs,vb}]
dotnet_diagnostic.CA2215.severity = none
如需詳細資訊,請參閱 如何隱藏程式代碼分析警告。
範例
下列範例示範實作TypeA
的兩種型別,IDisposable以及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);
}
}
}
}