[英]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.