Wytyczne ramowe konstrukcyjne (2nd Ed, strona 327). Słownie:Jak wdrożyć wzór dysponowania ścisłej metody poprawnie (CA1063)
rozważyć wprowadzenie metody
Close()
, dodatkowo doDispose()
, jeśli blisko jest standardem terminologia w tym obszarze.W tym przypadku ważne jest, aby zamknąć implementację identyczną z
Dispose
i rozważyć zastosowanie metodyIDisposable.Dispose
jawnie.
Więc po przewidzianym przykład mam tej klasy:
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 nie lubią, że:
CA1816: Microsoft.Usage: „SomeClass .Close() "wywołania" GC.SuppressFinalize (object) ", metoda, która jest zwykle wywoływana tylko w ramach implementacji" IDisposable.Dispose ". Aby uzyskać więcej informacji, patrz wzorzec IDisposable.
CA1816: Microsoft.Usage: Zmień "SomeClass.IDisposable.Dispose()", aby wywołać "GC.SuppressFinalize (object)". Zapobiegnie to niepotrzebnej sfinalizowaniu obiektu po jego usunięciu i wypadnięciu z zakresu.
CA1063: Microsoft.Design: Zmodyfikuj "SomeClass.IDisposable.Dispose()" tak, aby wywoływał Dispose (true), a następnie wywoływał GC.SuppressFinalize na bieżącej instancji obiektu ("this" lub "Me" w języku Visual Basic), a następnie zwraca.
CA1063: Microsoft.Design: Zmień nazwę "SomeClass.IDisposable.Dispose()" na "Usuń" i upewnij się, że jest zadeklarowany jako publiczny i zapieczętowany.
- Jak prawidłowo zaimplementować wzór likwidacji metodą zamknięcia?
-lub-
- Jak mogę stłumić ostrzeżenia?
Próbowałem
[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
this.Close();
}
ale FxCop 1.36 nadal je zgłasza.
EDIT: Zmiana wokół jak sugeruje eliminuje wszystkich, ale to ostrzeżenie:
CA1063: Microsoft.Design: Zmiana nazwy 'SomeClass.IDisposable.Dispose()' na 'Usunąć' i upewnić się, że jest to zadeklarowane jako publiczne i zapieczętowane.
EDIT 2: Rzeczywiście brakuje kodu CODE_ANALYSIS. Dzięki.