你怎么样;适当地“;当你的实现是一个空方法时,实现Dispose()(根据FxCop)?(约1063年)

本文关键字:实现 方法 Dispose 1063年 FxCop 根据 一个 怎么样 当你 | 更新日期: 2023-09-27 18:21:00

我有一个接口的实现,该接口扩展了IDisposable。在接口的特定实现中,我不需要处理任何东西,所以我只需要一个空的Dispose()方法。

public interface IMyStuff : IDisposable
{
}
public MyStuffImpl : IMyStuff
{
    public void Dispose()
    {
    }
}

现在在FxCop中,这导致CA1063:

Error, Certainty 95, for ImplementIDisposableCorrectly
{
    Resolution   : "Provide an overridable implementation of Dispose(
                   bool) on 'MyStuffImpl' or mark the type as sealed. 
                   A call to Dispose(false) should only clean up native 
                   resources. A call to Dispose(true) should clean up 
                   both managed and native resources."
}
CriticalWarning, Certainty 75, for CallGCSuppressFinalizeCorrectly
{
    Resolution   : "Change 'MyStuffImpl.Dispose()' to call 'GC.SuppressFinalize(
                   object)'. This will prevent derived types that introduce 
                   a finalizer from needing to re-implement 'IDisposable' 
                   to call it."
}
Error, Certainty 95, for ImplementIDisposableCorrectly
{
    Resolution   : "Modify 'MyStuffImpl.Dispose()' so that it 
                   calls Dispose(true), then calls GC.SuppressFinalize 
                   on the current object instance ('this' or 'Me' in Visual 
                   Basic), and then returns."
}

所以,看起来我可以用两种方法之一解决这个问题:


使类sealed:

public sealed MyStuffImpl : IMyStuff
{
    public void Dispose()
    {
    }
}

实现典型模式的一部分:

public MyStuffImpl : IMyStuff
{
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    private void Dispose(bool disposing)
    {
    }
}

在我的情况下,我不打算扩展这个实现,所以我可能会通过将其设为sealed来解决它,但我承认我真的不明白为什么它是密封的还是不密封的很重要。

而且,仅仅因为我的类是密封的,FxCop不再告诉我Dispose()应该调用GC.SupressFinalize(this);,但这真的是真的吗?不管怎样,在.NET中总是在Dispose中调用SupressFinalize是否"更好"?

你怎么样;适当地“;当你的实现是一个空方法时,实现Dispose()(根据FxCop)?(约1063年)

SuppressFinalize()没有意义,除非您的实例具有终结器
如果您的类没有终结器,但不是sealed,那么您仍然应该是SuppressFinalize,以防继承的类添加终结器。

除了Dispose(bool)需要是protected virtual之外,您的两个选项都是正确的。

在"实现典型模式的一部分"选项中,您应该将Dispose(bool)方法设置为protected virtual:

protected virtual void Dispose(bool disposing) 
{ 
} 

这将为子类提供一个处理其管理的任何资源的处置的机会。这就是"提供Dispose(bool)的可重写实现"中"可重写"的含义

当然,public virtual也将满足FxCop。