CA1812: Nicht instanziierte interne Klassen vermeiden.
Eigenschaft | Wert |
---|---|
Regel-ID | CA1812 |
Titel | Nicht instanziierte interne Klassen vermeiden. |
Kategorie | Leistung |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Nein |
Ursache
Ein interner Typ (auf Assembly-Ebene) wird nie instanziiert.
Regelbeschreibung
Diese Regel versucht, einen Konstruktoren des Typs aufzurufen, und meldet eine Verletzung, wenn kein Rückruf gefunden wird.
Die folgenden Typen werden von dieser Regel nicht untersucht:
- Werttypen
- Abstrakte Typen
- Enumerationen
- Delegaten
- Vom Compiler ausgegebene Array-Typen
- Typen, die nicht instanziiert werden können und nur
static
-Methoden definieren.
Wenn Sie System.Runtime.CompilerServices.InternalsVisibleToAttribute auf die zu analysierende Assembly anwenden, kennzeichnet diese Regel keine Typen, die standardmäßig nicht als internal
(Friend
in Visual Basic) gekennzeichnet sind, da ein Feld von einer Friend-Assembly verwendet werden kann. Wenn Sie die Assembly trotzdem analysieren möchten, finden Sie weitere Informationen unter Konfigurieren von zu analysierendem Code.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, entfernen Sie den Typ, oder fügen Sie den Code hinzu, der ihn verwendet. Wenn der Typ nur static
-Methoden enthält, fügen Sie dem Typ den static
-Modifizierer hinzu, um zu verhindern, dass der Compiler einen standardmäßigen öffentlichen Instanzkonstruktor ausgibt.
Wann sollten Warnungen unterdrückt werden?
Eine Warnung, die auf dieser Regel basiert, kann problemlos unterdrückt werden. Es wird empfohlen, dass Sie diese Warnung in den folgenden Situationen unterdrücken:
Die Klasse wird durch spät gebundene Reflexionsmethoden wie System.Activator.CreateInstance erstellt.
Die Klasse wird in einem Inversion-of-Control-Container (IoC) als Teil des Musters für die Dependency Injection registriert.
Die Klasse wird automatisch von der Runtime oder ASP.NET erstellt. Einige Beispiele für automatisch erstellte Klassen sind solche, die System.Configuration.IConfigurationSectionHandler oder System.Web.IHttpHandler implementieren.
Die Klasse wird als Typparameter in einer Klassendefinition verwendet und weist eine
new
-Einschränkung auf. Das folgende Beispiel wird durch die Regel CA1812 gekennzeichnet: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();
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA1812
// The code that's violating the rule is on this line.
#pragma warning restore CA1812
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA1812.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
Konfigurieren des zu analysierenden Codes
Mithilfe der folgenden Option können Sie konfigurieren, für welche Teile Ihrer Codebasis diese Regel ausgeführt werden soll.
Sie können diese Option nur für diese Regel, für alle zutreffenden Regeln oder für alle zutreffenden Regeln in dieser Kategorie (Leistung) konfigurieren. Weitere Informationen finden Sie unter Konfigurationsoptionen für die Codequalitätsregel.
Ignorieren des InternalsVisibleTo-Attribut
Standardmäßig ist diese Regel deaktiviert, wenn die zu analysierende Assembly InternalsVisibleToAttribute verwendet, um ihre internen Symbole verfügbar zu machen. Um festzulegen, dass die Regel auch dann ausgeführt werden soll, wenn die Assembly mit InternalsVisibleToAttribute gekennzeichnet ist, fügen Sie das folgende Schlüssel-Wert-Paar einer EDITORCONFIG-Datei in Ihrem Projekt hinzu:
dotnet_code_quality.CAXXXX.ignore_internalsvisibleto = true
Diese Option ist ab .NET 8 verfügbar.