2017-04-17 50 views
1

我的类实现IDisposable并遵循其中假阳性:修复此实现了IDisposable的,以符合Dispose模式

public void Dispose() 
{ 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

但声纳仍然告诉我,我需要实现Dispose模式模式...

https://sonarqube.com/issues#issues=AVtsPLjmtpYg8Dj4z0MU

这是用声纳的缺陷或有我错过了什么?

+0

也许它检测到你没有实现你的类终结,所以'SuppressFinalize'通话有没有影响? –

+0

另外,你的'Dispose(bool)'应该被保护吗?这至少是SonarQube明确说的: 'protected virtual void Dispose(bool disposing)' –

+0

1)那么它确实应该这么说,但我用过的模式与我所使用的模式相同,2)好眼睛,我会尝试但不知道它是否关心 –

回答

3

我看到你已经解决了这个问题,但如果别人有同样的问题,我会详细说明规则要求。

这条规则的思想是允许潜在的派生类正确地处理你的类的成员。因此,如果你的班级是密封的,这个规则假设你的班级正确处置自己并且什么都不做(另外一个规则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); 
    } 
} 
+0

您是否打算更换sonarqube中符合标准的样品以符合上述要求? –

+1

是的,我们将改变描述。 –

2

不要在您的Dispose()方法中调用GC.SuppressFinalize()方法,除非您的类实现了终结器。