Подтвердить что ты не робот

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

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

CONSIDER, предоставляющий метод Close(), в дополнение к Dispose(), если close - стандартная терминология в области.

При этом важно, чтобы реализация 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?

-или -

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

Я пробовал

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Также, изменив объявление на:

public void Dispose()

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

void IDisposable.Dispose()

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

Ответ 2

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

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