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