2009-03-10 10 views
12

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 do Dispose(), 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 metody IDisposable.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.

Odpowiedz

15

Zmień to.

Funkcja Zamknij() wywołaj to.Dispose() i umieść logikę w metodzie Dispose() zamiast metody Close().

------------------- Więcej informacji po edycji ---------------

Ponadto, zmieniając deklaracja do:

public void Dispose() 

powinien pozbyć się drugiego błędu. Ponieważ masz to zadeklarowane jako:

void IDisposable.Dispose() 

To nie jest oznaczone jako publiczne i zamknięte, a FxCop narzeka. Osobiście wolę unikać błędów zamiast ich tłumić.

1

Jak tłumić ostrzeżenia?

Funkcja SuppressMessage() działa tylko po określeniu flagi CODE_ANALYSIS jako warunkowego symbolu kompilacji.

Powiązane problemy