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