CA1812 : Évitez les classes internes non instanciées

Propriété Value
Identificateur de la règle CA1812
Titre Évitez les classes internes non instanciées
Catégorie Performances
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Non

Cause

Un type interne (au niveau de l’assembly) n’est jamais instancié.

Description de la règle

Cette règle tente de localiser un appel à l’un des constructeurs du type, et signale une violation si aucun appel n’est trouvé.

Les types suivants ne sont pas examinés par cette règle :

  • Types de valeur
  • Types abstraits
  • Énumérations
  • Délégués
  • Types de tableau émis par le compilateur
  • Les types qui ne peuvent pas être instanciés et qui définissent uniquement des méthodes static.

Si vous appliquez le System.Runtime.CompilerServices.InternalsVisibleToAttribute à l’assembly en cours d’analyse, cette règle ne signale pas les types marqués comme internal (Friend en Visual Basic) par défaut, car un champ peut être utilisé par un assembly ami. Pour analyser l’assembly quand même, consultez Configurer le code à analyser.

Comment corriger les violations

Pour corriger une violation de cette règle, supprimez le type ou ajoutez du code qui l’utilise. Si le type contient uniquement des méthodes static, ajoutez le modificateur static au type afin d’empêcher le compilateur d’émettre un constructeur d’instance publique par défaut.

Quand supprimer les avertissements

Vous pouvez supprimer un avertissement de cette règle. Nous vous recommandons de supprimer cet avertissement dans les situations suivantes :

  • La classe est créée via des méthodes de réflexion à liaison tardive telles que System.Activator.CreateInstance

  • La classe est inscrite dans un conteneur d’inversion de contrôle (IoC) dans le cadre du modèle d’injection de dépendances

  • La classe est créée automatiquement par le runtime ou ASP.NET. Parmi les classes créées automatiquement figurent celles qui implémentent System.Configuration.IConfigurationSectionHandler ou System.Web.IHttpHandler

  • La classe est utilisée comme paramètre de type dans une définition de classe et elle a une contrainte new. L’exemple suivant sera marqué par la règle CA1812 :

    internal class MyClass
    {
        public void DoSomething()
        {
        }
    }
    public class MyGeneric<T> where T : new()
    {
        public T Create()
        {
            return new T();
        }
    }
    
    MyGeneric<MyClass> mc = new MyGeneric<MyClass>();
    mc.Create();
    

Supprimer un avertissement

Si vous voulez supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver et réactiver la règle.

#pragma warning disable CA1812
// The code that's violating the rule is on this line.
#pragma warning restore CA1812

Pour désactiver la règle sur un fichier, un dossier ou un projet, définissez sa gravité sur none dans le fichier de configuration.

[*.{cs,vb}]
dotnet_diagnostic.CA1812.severity = none

Pour plus d’informations, consultez Comment supprimer les avertissements de l’analyse de code.

Configurer le code à analyser

Utilisez l’option suivante pour configurer les parties de votre codebase sur lesquelles exécuter cette règle.

Vous pouvez configurer cette option pour cette règle uniquement, pour toutes les règles auxquelles elle s’applique ou pour toutes les règles de cette catégorie (Performances) auxquelles elle s’applique. Pour plus d’informations, consultez Options de configuration des règles de qualité du code.

Ignorer l’attribut InternalsVisibleTo

Par défaut, cette règle est désactivée si l’assembly analysé utilise InternalsVisibleToAttribute pour exposer ses symboles internes. Pour spécifier que la règle doit s’exécuter même si l’assembly est marqué avec InternalsVisibleToAttribute, ajoutez la paire clé-valeur suivante à un fichier .editorconfig dans votre projet :

dotnet_code_quality.CAXXXX.ignore_internalsvisibleto = true

Cette option est disponible à partir de .NET 8.