我的类实现IDisposable
并遵循其中假阳性:修复此实现了IDisposable的,以符合Dispose模式
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
但声纳仍然告诉我,我需要实现Dispose模式模式...
https://sonarqube.com/issues#issues=AVtsPLjmtpYg8Dj4z0MU
这是用声纳的缺陷或有我错过了什么?
我的类实现IDisposable
并遵循其中假阳性:修复此实现了IDisposable的,以符合Dispose模式
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
但声纳仍然告诉我,我需要实现Dispose模式模式...
https://sonarqube.com/issues#issues=AVtsPLjmtpYg8Dj4z0MU
这是用声纳的缺陷或有我错过了什么?
我看到你已经解决了这个问题,但如果别人有同样的问题,我会详细说明规则要求。
这条规则的思想是允许潜在的派生类正确地处理你的类的成员。因此,如果你的班级是密封的,这个规则假设你的班级正确处置自己并且什么都不做(另外一个规则S2931检查你的班级是否包含需要处置的IDisposable
字段)。
如果该类未被封闭,规则将检查它是否具有实现IDisposable
的基类。如果有,并且您的班级也执行IDisposable
,则该规则会建议您删除您的实施(例如,从班级中删除IDisposable
界面)并覆盖基类的protected Dispose(bool)
方法。
如果基类没有实现IDisposable
,则该规则需要一个protected virtual Dispose(bool)
方法(以允许继承者正确地处理您的类)。
如果您的类包含终结器,即析构函数,那么规则会检查其内容是否为单次调用Dispose(false)
。
规则检查Dispose()
方法(来自接口的方法)的内容是否包含单个调用Dispose(true)
。如果您的班级有终结者,则该规则需要额外致电GC.SuppressFinalize(this)
。
基本上这些都是根据规则IDisposable
正确的实现:
Sealed类
public sealed class Foo1 : IDisposable
{
public void Dispose()
{
// Cleanup
}
}
简单实现
public class Foo2 : IDisposable
{
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
// Cleanup
}
}
实现了终结
public class Foo3 : IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
// Cleanup
}
~Foo3()
{
Dispose(false);
}
}
您是否打算更换sonarqube中符合标准的样品以符合上述要求? –
是的,我们将改变描述。 –
不要在您的Dispose()
方法中调用GC.SuppressFinalize()
方法,除非您的类实现了终结器。
也许它检测到你没有实现你的类终结,所以'SuppressFinalize'通话有没有影响? –
另外,你的'Dispose(bool)'应该被保护吗?这至少是SonarQube明确说的: 'protected virtual void Dispose(bool disposing)' –
1)那么它确实应该这么说,但我用过的模式与我所使用的模式相同,2)好眼睛,我会尝试但不知道它是否关心 –