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.