Share via


CA1012: Abstrakta typer bör inte ha offentliga konstruktorer

Property Värde
Regel-ID CA1012
Rubrik Abstrakta typer bör inte ha offentliga konstruktorer
Kategori Designa
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Nej

Orsak

En typ är abstrakt och har en offentlig konstruktor.

Som standard tittar den här regeln bara på externt synliga typer, men det kan konfigureras.

Regelbeskrivning

Konstruktorer för abstrakta typer kan bara anropas av härledda typer. Eftersom offentliga konstruktorer skapar instanser av en typ och du inte kan skapa instanser av en abstrakt typ, är en abstrakt typ som har en offentlig konstruktor felaktigt utformad.

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

Om du vill åtgärda en överträdelse av den här regeln gör du konstruktorn skyddad eller deklarerar inte typen som abstrakt.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln. Den abstrakta typen har en offentlig konstruktor.

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 CA1012
// The code that's violating the rule is on this line.
#pragma warning restore CA1012

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.CA1012.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 gäller för eller för alla regler i den här kategorin (design) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.

Inkludera specifika API-ytor

Du kan konfigurera vilka delar av kodbasen som ska köras med den här regeln baserat på deras tillgänglighet. Om du till exempel vill ange att regeln endast ska köras mot den icke-offentliga API-ytan lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Exempel

Följande kodfragment innehåller en abstrakt typ som bryter mot den här regeln.

' Violates this rule      
Public MustInherit Class Book

    Public Sub New()
    End Sub

End Class
// Violates this rule
public abstract class Book
{
    public Book()
    {
    }
}

Följande kodfragment åtgärdar den tidigare överträdelsen genom att ändra konstruktorns tillgänglighet från public till protected.

// Does not violate this rule
public abstract class Book
{
    protected Book()
    {
    }
}
' Violates this rule      
Public MustInherit Class Book

    Protected Sub New()
    End Sub

End Class