CA1812: Vermijd niet-geïnstantieerde interne klassen

Eigenschap Waarde
Regel-id CA1812
Titel Vermijd niet-geïnstantieerde interne klassen
Categorie Prestaties
Fix kan brekend of niet-brekend zijn Niet-brekend
Standaard ingeschakeld in .NET 10 Nee
Toepasselijke talen C# en Visual Basic

Oorzaak

Een intern type (assembly-niveau) 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 de compiler gegenereerde arraytypen
  • Typen die niet kunnen worden geïnstantieerd en die alleen methoden definiëren static .

Als u System.Runtime.CompilerServices.InternalsVisibleToAttribute toepast op de assembly die wordt geanalyseerd, markeert deze regel standaard geen typen die zijn gemarkeerd als internal (Friend in Visual Basic), omdat een veld mogelijk wordt gebruikt door een vriend-assembly. Als u de assembly toch wilt analyseren, ziet u Code configureren om te analyseren.

Hoe schendingen op te lossen

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 laatgebonden 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 voor meer informatie Hoe codeanalysewaarschuwingen te onderdrukken.

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

Standaard is deze regel uitgeschakeld als de assembly die wordt geanalyseerd InternalsVisibleToAttribute gebruikt om zijn interne symbolen beschikbaar te maken. U kunt de optie ignore_internalsvisibleto instellen om de configuratie te wijzigen. 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

Notitie

Vervang het XXXX deel van CAXXXX door de id van de toepasselijke regel.

Deze optie is beschikbaar vanaf .NET 8.