Как правильно реализовать шаблон утилизации методом close (CA1063) - PullRequest
12 голосов
/ 10 марта 2009

В Руководстве по проектированию рамок (2-е изд., Стр. 327) сказано:

РАССМОТРЕТЬ, предоставляя метод Close(), в дополнение к Dispose(), если закрытие является стандартной терминологией в области.

При этом важно сделать реализацию Close идентичной Dispose и рассмотреть возможность явной реализации IDisposable.Dispose.

Итак, следуя предоставленному примеру, я получил этот класс:

public class SomeClass : IDisposable {
    private SomeDisposable someInnerDisposable;

    public void Open() {
        this.someInnerDisposable = new SomeDisposable();
    }

    void IDisposable.Dispose() {
        this.Close();
    }

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

    protected virtual void Dispose(bool disposing) {
        if (disposing) {
            this.someInnerDisposable.Dispose();
            this.someInnerDisposable = null;
        }
    }
}

FxCop, похоже, не такой:

CA1816: Microsoft.Usage: «SomeClass.Close ()» вызывает «GC.SuppressFinalize (object)», метод, который обычно вызывается только в реализации «IDisposable.Dispose». Обратитесь к шаблону IDisposable для получения дополнительной информации.

CA1816: Microsoft.Usage: измените SomeClass.IDisposable.Dispose () на вызов GC.SuppressFinalize (object) '. Это предотвратит ненужную доработку объекта после его удаления и выхода из области видимости.

CA1063: Microsoft.Design: измените SomeClass.IDisposable.Dispose () так, чтобы он вызывал Dispose (true), затем вызывал GC.SuppressFinalize для текущего экземпляра объекта («this» или «Me» в Visual Basic) , а затем возвращается.

CA1063: Microsoft.Design: переименуйте SomeClass.IDisposable.Dispose () в Dispose и убедитесь, что он объявлен как открытый и закрытый.

  • Как правильно реализовать шаблон dispose с методом close?

-или-

  • Как мне подавить предупреждения?

Я пытался

[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
    Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
    this.Close();
}

, но FxCop 1.36 все еще сообщает о них.

РЕДАКТИРОВАТЬ : Изменение его, как предлагается, устраняет все, кроме этого предупреждения:

CA1063: Microsoft.Design: Переименуйте SomeClass.IDisposable.Dispose () в Dispose и убедитесь, что он объявлен как открытый и закрытый.

EDIT 2 : CODE_ANALYSIS действительно отсутствует. Спасибо.

Ответы [ 2 ]

15 голосов
/ 10 марта 2009

Измени это вокруг.

Пусть Close () вызывает this.Dispose () и помещает логику в метод Dispose () вместо метода Close ().

------------------- Дополнительная информация после редактирования ---------------

Кроме того, изменив объявление на:

public void Dispose()

должен избавиться от другой ошибки. Так как он объявлен как:

void IDisposable.Dispose()

Он не помечен как открытый и закрытый, и FxCop жалуется. Лично я предпочитаю избегать ошибок, а не подавлять их.

1 голос
/ 10 марта 2009

Как мне подавить предупреждения?

SuppressMessage () работает, только когда вы указываете флаг CODE_ANALYSIS как символ условной компиляции.

...