CA1812: Undvik oinstifierade interna klasser

Property Värde
Regel-ID CA1812
Rubrik Undvik oinstifierade interna klasser
Kategori Prestanda
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

En intern typ (sammansättningsnivå) instansieras aldrig.

Regelbeskrivning

Den här regeln försöker hitta ett anrop till en av konstruktorerna av typen och rapporterar en överträdelse om inget anrop hittas.

Följande typer granskas inte av den här regeln:

  • Värdetyper
  • Abstrakta typer
  • Uppräkningar
  • Ombud
  • Matristyper som genereras av kompilatorn
  • Typer som inte kan instansieras och som bara definierar static metoder.

Om du använder System.Runtime.CompilerServices.InternalsVisibleToAttribute den sammansättning som analyseras flaggar den här regeln inte typer som är markerade som internal (Friend i Visual Basic) som standard, eftersom ett fält kan användas av en vänsammansättning. Information om hur du analyserar sammansättningen finns i Konfigurera kod att analysera.

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln tar du bort den typ eller lägger till kod som använder den. Om typen endast static innehåller metoder lägger du till static modifieraren i typen för att förhindra att kompilatorn genererar en standardkonstruktor för offentlig instans.

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln. Vi rekommenderar att du utelämnar den här varningen i följande situationer:

  • Klassen skapas via senbundna reflektionsmetoder, till exempel System.Activator.CreateInstance.

  • Klassen registreras i en inversion av kontrollcontainern (IoC) som en del av beroendeinmatningsmönstret.

  • Klassen skapas automatiskt av körningen eller ASP.NET. Några exempel på automatiskt skapade klasser är de som implementerar System.Configuration.IConfigurationSectionHandler eller System.Web.IHttpHandler.

  • Klassen används som en typparameter i en klassdefinition och har en new begränsning. Följande exempel flaggas av regeln 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();
    

Ignorera en varning

Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.

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

Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none i konfigurationsfilen.

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

Mer information finns i Så här utelämnar du kodanalysvarningar.

Konfigurera kod för analys

Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.

Du kan konfigurera det här alternativet för bara den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (Prestanda) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.

Ignorera attributet InternalsVisibleTo

Som standard inaktiveras den här regeln om sammansättningen som analyseras använder InternalsVisibleToAttribute för att exponera dess interna symboler. Om du vill ange att regeln ska köras även om sammansättningen är markerad med InternalsVisibleToAttributelägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CAXXXX.ignore_internalsvisibleto = true

Det här alternativet är tillgängligt från och med .NET 8.