Как вы «правильно» реализуете Dispose () (согласно FxCop), когда ваша реализация является пустым методом? (CA1063)

У меня есть реализация интерфейса, и этот интерфейс расширяет 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."
}

Итак, похоже, я могу решить эту проблему одним из двух способов:


Сделать класс запечатанным :

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

Реализовать часть типичного шаблона:

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

    private void Dispose(bool disposing)
    {
    }
}

В моем случае я не планирую когда-либо расширять эту реализацию, поэтому я, вероятно, решу его, сделав его запечатанным , но я признаю, что действительно не понимаю почему важно, запломбирован он или нет.

Кроме того, только потому, что мой класс запечатан, FxCop больше не сообщает мне, что Dispose () должен вызывать GC.SupressFinalize (this); , но так ли это на самом деле? «Лучше» ли в .NET всегда вызывать SupressFinalize в Dispose независимо?

15
задан CodingWithSpike 20 January 2012 в 21:22
поделиться