Partager via


Évitez les classes internes non instanciées

Mise à jour : novembre 2007

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.

  • Types qui ne peuvent pas être instanciés et qui définissent uniquement des méthodes static.

Si vous appliquez System.Runtime.CompilerServices.InternalsVisibleToAttribute à l'assembly qui est en cours d'analyse, cette règle ne se déclenchera 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, le FxCop autonome externe se déclenchera 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 pour les types ciblant .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 automatiquement créée par l'exécution 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

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

Passez en revue les paramètres inutilisés

Supprimez les variables locales inutilisées