Come implementare correttamente il modello di smaltimento con il metodo close (CA1063)

StackOverflow https://stackoverflow.com/questions/630955

  •  08-07-2019
  •  | 
  •  

Domanda

Le Linee guida per la progettazione del framework (2a edizione, pagina 327) dicono:

  

CONSIDERA fornire il metodo Close () , oltre al Dispose () , se close è la terminologia standard nell'area.

     

Nel fare ciò, è importante rendere l'implementazione Chiudi identica a Dispose e prendere in considerazione l'implementazione esplicita del metodo IDisposable.Dispose .

Quindi, seguendo l'esempio fornito, ho questa classe:

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;
        }
    }
}

A FxCop non sembra piacere:

  

CA1816: Microsoft.Usage: 'SomeClass.Close ()' chiama 'GC.SuppressFinalize (oggetto)', un metodo che viene in genere chiamato solo all'interno di un'implementazione di 'IDisposable.Dispose'. Fare riferimento al modello IDisposable per ulteriori informazioni.

     

CA1816: Microsoft.Usage: modifica "SomeClass.IDisposable.Dispose ()" per chiamare "GC.SuppressFinalize (object)". Ciò impedirà la finalizzazione non necessaria dell'oggetto una volta che è stato eliminato e non rientra nell'ambito di applicazione.

     

CA1063: Microsoft.Design: modifica 'SomeClass.IDisposable.Dispose ()' in modo che chiami Dispose (true), quindi chiami GC.SuppressFinalize sull'istanza dell'oggetto corrente ('this' o 'Me' in Visual Basic) e quindi ritorna.

     

CA1063: Microsoft.Design: rinomina "SomeClass.IDisposable.Dispose ()" in "Dispose" e assicurati che sia dichiarato pubblico e sigillato.

  • Come posso implementare correttamente il modello dispose con il metodo close?

-o -

  • Come posso eliminare gli avvisi?

Ho provato

[SuppressMessage("Microsoft.Design", "CA1063:ImplementIDisposableCorrectly",
    Justification = "Framework Design Guidelines say it's ok.")]
void IDisposable.Dispose()
{
    this.Close();
}

ma FxCop 1.36 li riporta comunque.

MODIFICA : cambiarlo come suggerito elimina tutto tranne questo avviso:

  

CA1063: Microsoft.Design: rinomina "SomeClass.IDisposable.Dispose ()" in "Dispose" e assicurati che sia dichiarato pubblico e sigillato.

MODIFICA 2 : CODE_ANALYSIS mancava davvero. Grazie.

È stato utile?

Soluzione

Cambialo in giro.

Have Close () chiama this.Dispose () e inserisce la logica nel metodo Dispose () anziché nel metodo Close ().

------------------- Ulteriori informazioni dopo la modifica ---------------

Inoltre, cambiando la dichiarazione in:

public void Dispose()

dovrebbe sbarazzarsi dell'altro errore. Dal momento che lo hai dichiarato come:

void IDisposable.Dispose()

Non è contrassegnato come pubblico e sigillato e FxCop si lamenta. Personalmente, preferisco evitare gli errori invece di eliminarli.

Altri suggerimenti

  

Come posso eliminare gli avvisi?

SuppressMessage () funziona solo quando si specifica il flag CODE_ANALYSIS come simbolo di compilazione condizionale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top