В Руководстве по проектированию рамок (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 действительно отсутствует. Спасибо.