Partager via


CA1812 : Évitez les classes internes non instanciées

TypeName

AvoidUninstantiatedInternalClasses

CheckId

CA1812

Catégorie

Microsoft.Performance

Modification avec rupture

Modification sans rupture

Cause

Une instance d'un type de niveau assembly n'est pas créée par le code au sein de l'assembly.

Description de la règle

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

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

  • Types valeur

  • Types abstraits

  • Énumérations

  • Délégués

  • Types tableau émis par un compilateur.

  • Les types qui ne peuvent pas être instanciés et qui définissent uniquement des méthodes static (Shared en Visual Basic).

Si vous appliquez System.Runtime.CompilerServices.InternalsVisibleToAttribute à l'assembly qui est en cours d'analyse, cette règle ne se produira pas sur les constructeurs marqués comme internal parce que vous ne pouvez pas savoir si un champ est utilisé par un autre assembly friend.

Bien que vous ne puissiez pas contourner cette limitation dans l'analyse du code de Visual Studio, l'outil FxCop autonome externe se déclenche sur les constructeurs internes si chaque assembly friend est présent dans l'analyse.

Comment corriger les violations

Pour corriger une violation de cette règle, supprimez le type ou ajoutez le code qui l'utilise. Si le type contient uniquement des méthodes statiques, ajoutez-lui une des suivantes pour empêcher le compilateur d'émettre un constructeur d'instances publiques par défaut :

  • Constructeur privé pour des types ciblant les versions 1.0 et 1.1 de .NET Framework.

  • Modificateur static (Shared en Visual Basic) des types qui ciblent .NET Framework 2.0.

Quand supprimer les avertissements

Il est possible de supprimer sans risque un avertissement de cette règle. Nous vous recommandons de supprimer cet avertissement dans les situations suivantes :

  • La classe est créée à travers les méthodes de réflexion à liaison tardive, telles que CreateInstance.

  • La classe est créée automatiquement par le runtime ou ASP.NET. Par exemple, les classes qui implémentent System.Configuration.IConfigurationSectionHandler ou System.Web.IHttpHandler.

  • La classe est passée comme un paramètre de type générique avec une nouvelle contrainte. L'exemple suivant déclenche cette règle.

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

Dans ces situations, nous vous avons recommandé de supprimer cet avertissement.

Règles connexes

CA1811 : Évitez le recours à du code privé non appelé

CA1801 : Passez en revue les paramètres inutilisés

CA1804 : Supprimez les variables locales inutilisées