5 votes

Utilisation de la règle CA1001 de l'analyseur .NET pour les composants d'un cadre qui n'utilise pas IDisposable.

J'ai un projet Unity avec des analyseurs Roslyn activés, l'un d'eux est CA1001 : "Les types qui possèdent des champs jetables doivent être jetables" ( https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1001 ).

Cela s'avère utile pour les classes qui sont créées et détruites manuellement, pour voir si elles disposent correctement de tous leurs champs. Cependant, dans de nombreux cas, en raison de la nature virale d'IDisposable, les objets supérieurs qui les créent sont des composants, des classes MonoBehaviour dans le cas d'Unity. Pour satisfaire à la règle, il faudrait ajouter IDisposable à la classe MonoBehaviour et implémenter correctement le pattern dispose. Cependant, cela n'ajoute pas beaucoup de valeur à la classe, car étant un composant d'un framework qui ne repose pas sur IDisposable, elle ne sera jamais appelée.

Dans ce cas, la meilleure solution serait de modifier la règle de manière à vérifier si les champs IDisposable ont été éliminés par la méthode OnDestroy. Existe-t-il un moyen de modifier la règle CA1001 pour qu'elle fonctionne ainsi pour les sous-classes MonoBehaviour ? Ou existe-t-il un autre analyseur capable de le faire ? Si ce n'est pas le cas, peut-on au moins désactiver la règle pour les sous-classes d'un type spécifique (le mieux que j'ai pu faire jusqu'à présent est de supprimer la règle pour les fichiers nommés "*Component.cs" mais c'est loin d'être le mieux).

Ma question s'adresse à Unity, mais elle s'applique en fait à tout cadre ne reposant pas sur l'interface IDisposable.

Editar:

Exemple de code :

public class Resource : IDisposable
{
    public void Dispose()
    {
        Debug.Log("Resource disposed");
    }
}

public class ExampleComponent : MonoBehaviour
{
    private Resource resource;

    private void Start()
    {
        resource = new Resource();
    }

    private void OnDestroy()
    {
        resource.Dispose();
    }
}

Dans ce cas resource est éliminé de manière appropriée dans le système conventionnel OnDestroy mais la méthode CA1001 est toujours déclenchée.

0voto

derHugo Points 12631

Je pense que vous pouvez ignorer la règle pour tout type dérivé de UnityEngine.MonoBehaviour via Exclure des types spécifiques et leurs types dérivés (dans le même lien que celui que vous avez posté)

ajoutez la paire clé-valeur suivante à un .editorconfig dans votre projet

quelque chose comme

dotnet_code_quality.CA1001.excluded_type_names_with_derived_types = T:UnityEngine.MonoBehaviour

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X