CA1812: Nicht instanziierte interne Klassen vermeiden
TypeName |
AvoidUninstantiatedInternalClasses |
CheckId |
CA1812 |
Kategorie |
Microsoft.Performance |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Eine Instanz eines Typs auf Assemblyebene wird nicht durch Code in der Assembly erstellt.
Regelbeschreibung
Diese Regel versucht, einen Aufruf eines der Konstruktoren des Typs zu finden, und meldet einen Verstoß, wenn kein Aufruf gefunden wird.
Die folgenden Typen werden durch diese Regel nicht überprüft:
Werttypen
Abstrakte Typen
Enumerationen
Delegaten
Von einem Compiler ausgegebene Arraytypen
Typen, die nicht instanziiert werden können und nur static Methoden (Shared in Visual Basic) definieren.
Wenn Sie System.Runtime.CompilerServices.InternalsVisibleToAttribute auf die zu analysierende Assembly anwenden, wird diese Regel nicht für Konstruktoren ausgelöst, die mit internal markiert sind, da nicht zu erkennen ist, ob ein Feld von einer anderen friend-Assembly verwendet wird.
Obwohl es keine Möglichkeit gibt, diese Einschränkung der Visual Studio-Codeanalyse zu umgehen, wird der externe eigenständige FxCop-Prozess für interne Konstruktoren ausgelöst, wenn die einzelnen friend-Assemblys in der Analyse vorhanden sind.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, entfernen Sie den Typ, oder fügen Sie den Code hinzu, in dem der Typ verwendet wird. Wenn der Typ nur statische Methoden enthält, fügen Sie dem Typ eines der folgenden Elemente hinzu, um den Compiler daran zu hindern, einen Standardkonstruktor für eine öffentliche Instanz auszugeben:
Einen privaten Konstruktor für Typen, die auf .NET Framework, Version 1.0 und 1.1, abzielen.
Der static-Modifizierer (Shared in Visual Basic) für Typen, die auf .NET Framework 2.0 abzielen.
Wann sollten Warnungen unterdrückt werden?
Warnungen dieser Regel können gefahrlos unterdrückt werden. Es wird empfohlen, diese Warnung in den folgenden Situationen zu unterdrücken:
Die Klasse wird durch spät gebundene Reflektionsmethoden wie CreateInstance erstellt.
Die Klasse wird automatisch von der Runtime oder von ASP.NET erstellt. Zum Beispiel Klassen, die System.Configuration.IConfigurationSectionHandler oder System.Web.IHttpHandler implementieren.
Die Klasse wird als generischer Typparameter mit einer neuen Einschränkung übergeben. Im folgenden Beispiel wird z. B. diese Regel ausgelöst:
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();
Die Empfehlung für diese Situationen lautete, die Warnung zu unterdrücken.
Verwandte Regeln
CA1811: Nicht aufgerufenen privaten Code vermeiden