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 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 IConfigurationSectionHandler ou 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é