Share via


CA1812: Vermijd niet-geïnstantieerde interne klassen

Eigenschappen Weergegeven als
Regel-id CA1812
Titel Vermijd niet-geïnstantieerde interne klassen
Categorie Prestaties
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

Een intern type (assemblyniveau) wordt nooit geïnstantieerd.

Beschrijving van regel

Deze regel probeert een aanroep naar een van de constructors van het type te vinden en meldt een schending als er geen aanroep wordt gevonden.

De volgende typen worden niet onderzocht door deze regel:

  • Waardetypen
  • Abstracte typen
  • Opsommingen
  • Gedelegeerden
  • Door compiler verzonden matrixtypen
  • Typen die niet kunnen worden geïnstantieerd en die alleen methoden definiëren static .

Als u van toepassing bent op System.Runtime.CompilerServices.InternalsVisibleToAttribute de assembly die wordt geanalyseerd, worden met deze regel standaard geen markeringstypen gemarkeerd als internal (Friend in Visual Basic), omdat een veld mogelijk wordt gebruikt door een vriendassembly. Als u de assembly toch wilt analyseren, raadpleegt u Code configureren om te analyseren.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, verwijdert u het type of voegt u code toe die deze gebruikt. Als het type alleen static methoden bevat, voegt u de static wijzigingsfunctie toe aan het type om te voorkomen dat de compiler een standaardconstructor voor openbare exemplaren verzendt.

Wanneer waarschuwingen onderdrukken

Het is veilig om een waarschuwing van deze regel te onderdrukken. We raden u aan deze waarschuwing in de volgende situaties te onderdrukken:

  • De klasse wordt gemaakt via late-gebonden reflectiemethoden zoals System.Activator.CreateInstance.

  • De klasse wordt geregistreerd in een ioC-container (Inversion of Control) als onderdeel van het patroon voor afhankelijkheidsinjectie .

  • De klasse wordt automatisch gemaakt door de runtime of ASP.NET. Enkele voorbeelden van automatisch gemaakte klassen zijn klassen die implementeren System.Configuration.IConfigurationSectionHandler of System.Web.IHttpHandler.

  • De klasse wordt gebruikt als een typeparameter in een klassedefinitie en heeft een new beperking. Het volgende voorbeeld wordt gemarkeerd met regel CA1812:

    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();
    

Een waarschuwing onderdrukken

Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.

#pragma warning disable CA1812
// The code that's violating the rule is on this line.
#pragma warning restore CA1812

Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none ervan in op het configuratiebestand.

[*.{cs,vb}]
dotnet_diagnostic.CA1812.severity = none

Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.

Code configureren om te analyseren

Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.

U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (prestaties) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.

Kenmerk InternalsVisibleTo negeren

Deze regel is standaard uitgeschakeld als de assembly die wordt geanalyseerd, wordt gebruikt InternalsVisibleToAttribute om de interne symbolen beschikbaar te maken. Als u wilt opgeven dat de regel moet worden uitgevoerd, zelfs als de assembly is gemarkeerd met InternalsVisibleToAttribute, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:

dotnet_code_quality.CAXXXX.ignore_internalsvisibleto = true

Deze optie is beschikbaar vanaf .NET 8.