我目前正在得到我分析的代码上的CA2202 (不要多次释放对象)。警告指的是我正在重写的HttpApplication.Dispose方法。我知道IDispose.Dipose方法不应该是虚拟的或者是过度的,但是这是微软在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;
}
}
}发布于 2016-01-26 04:43:03
似乎没有办法,除非压制一些东西。我的解决方案是将对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;
}
}https://stackoverflow.com/questions/29007613
复制相似问题