[英]CA2202 CA2215 HttpApplication Dispose base call
我目前正在我正在分析的代碼上獲取CA2202 ( 請勿多次放置對象 )。 警告是指我重寫的HttpApplication.Dispose
方法。 我知道IDispose.Dipose
方法不應是虛擬的或被覆蓋,但這是Microsoft在HttpApplication
類中實現IDispose.Dispose
為虛擬的並且沒有提供受保護的虛擬Dispose方法的結果。
該警告似乎是在抱怨base.Dispose
方法的調用。 我正在調用基本Dispose方法,以防基類需要關閉或處理任何對象。 還要懷疑,否則我可能最終會收到CA2215 ( Dispose方法應調用基類dispose )警告。
有誰知道我為什么收到此警告(CA2202)以及如何處理?
我很想抑制它,但是MSDN文檔說它永遠不應該被抑制。
子類如下所示(為簡潔起見已被縮短,您可以假定_container
字段已初始化):
public class MyHttpApplication : HttpApplication
{
private bool _disposed;
private IDisposable _container;
public sealed override void Dispose()
{
if (_disposed)
return;
try
{
Dispose(true);
GC.SuppressFinalize(this);
}
finally
{
//The following lines is what causes the CA2202 code analysis warning
base.Dispose();
}
}
protected virtual void Dispose(bool disposing)
{
if (_disposed)
return;
try
{
if (disposing && _container != null)
{
_container.Dispose();
}
}
finally
{
_disposed = true;
}
}
}
似乎沒有抑制的辦法是沒有出路的。 我的解決方案是將對base.Dispose()的調用放在Dispose(bool)方法內,然后禁止CA2215,為此, MSDN文檔說:“如果對base.Dispose的調用發生在以下位置,則可以從該規則中禁止警告。比規則檢查的呼叫級別更深。”
[SuppressMessage("Microsoft.Usage", "CA2215:Dispose methods should call base class dispose", Justification = "base.Dispose() is called from Dispose(bool)")]
public sealed override void Dispose()
{
if (_disposed)
return;
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (_disposed)
return;
try
{
if (disposing)
{
base.Dispose();
if (_container != null)
{
_container.Dispose();
}
}
}
finally
{
_disposed = true;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.