Comment mettre en œuvre correctement le modèle de disposition avec la méthode close (CA1063)

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

  •  08-07-2019
  •  | 
  •  

Question

Les directives pour la conception de la structure (2e édition, page 327) disent:

  

La méthode fournie par CONSIDER Close () , en plus de Dispose () , si close est la terminologie standard dans la région.

     

Ce faisant, il est important de rendre l’implémentation Close identique à Dispose et d’envisager de mettre en œuvre la méthode IDisposable.Dispose de manière explicite.

Donc, en suivant l'exemple fourni, j'ai cette 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;
        }
    }
}

FxCop ne semble pas aimer ça:

  

CA1816: Microsoft.Usage: "SomeClass.Close ()" appelle "GC.SuppressFinalize (object)", une méthode généralement appelée dans une implémentation de "IDisposable.Dispose". Reportez-vous au modèle IDisposable pour plus d'informations.

     

CA1816: Microsoft.Usage: Modifiez 'SomeClass.IDisposable.Dispose ()' pour appeler 'GC.SuppressFinalize (object)'. Cela évitera la finalisation inutile de l'objet une fois qu'il aura été éliminé et s'il est tombé hors de portée.

     

CA1063: Microsoft.Design: Modifiez 'SomeClass.IDisposable.Dispose ()' pour qu'il appelle Dispose (true), puis appelle GC.SuppressFinalize sur l'instance d'objet en cours ('this' ou 'Me' dans Visual Basic) , puis revient.

     

CA1063: Microsoft.Design: renommez 'SomeClass.IDisposable.Dispose ()' en 'Dispose' et assurez-vous qu'il est déclaré public et scellé.

  • Comment implémenter correctement le modèle de disposition avec la méthode close?

-ou -

  • Comment supprimer les avertissements?

j'ai essayé

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

mais FxCop 1.36 les rapporte toujours.

MODIFIER : le modifier comme suggéré élimine tout sauf cet avertissement:

  

CA1063: Microsoft.Design: renommez 'SomeClass.IDisposable.Dispose ()' en 'Dispose' et assurez-vous qu'il est déclaré public et scellé.

MODIFIER 2 : CODE_ANALYSIS était en effet manquant. Merci.

Était-ce utile?

La solution

Modifiez-le.

Avez Close () appelez this.Dispose () et placez la logique dans la méthode Dispose () à la place de la méthode Close ().

------------------- Plus d'informations après la modification ---------------

En outre, modification de la déclaration en:

public void Dispose()

devrait se débarrasser de l’autre erreur. Depuis que vous l'avez déclaré comme:

void IDisposable.Dispose()

Ce n'est pas marqué comme public et scellé, et FxCop se plaint. Personnellement, je préfère éviter les erreurs au lieu de les supprimer.

Autres conseils

  

Comment supprimer les avertissements?

SuppressMessage () fonctionne uniquement lorsque vous spécifiez le drapeau CODE_ANALYSIS en tant que symbole de compilation conditionnelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top