Как правильно реализовать шаблон удаления с помощью метода закрытия (CA1063)

В Руководстве по проектированию каркаса (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 и убедитесь, что он объявлен как общедоступный и запечатан.

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

-or-

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

Я пытался

[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 и убедитесь, что он объявлен как общедоступный и запечатан.

РЕДАКТИРОВАТЬ 2: CODE_ANALYSIS действительно отсутствовал. Спасибо.


person dtb    schedule 10.03.2009    source источник


Ответы (2)


Измените это.

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

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

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

public void Dispose()

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

void IDisposable.Dispose()

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

person Reed Copsey    schedule 10.03.2009

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

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

person tanascius    schedule 10.03.2009