Sdílet prostřednictvím


CA1012: Abstraktní typy by neměly mít veřejné konstruktory

Vlastnost Hodnota
ID pravidla CA1012
Název Abstraktní typy by neměly mít veřejné konstruktory.
Kategorie Návrh
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 9 No

Příčina

Typ je abstraktní a má veřejný konstruktor.

Ve výchozím nastavení toto pravidlo sleduje jenom externě viditelné typy, ale dá se konfigurovat.

Popis pravidla

Konstruktory abstraktních typů mohou být volány pouze odvozenými typy. Protože veřejné konstruktory vytvářejí instance typu a nelze vytvořit instance abstraktního typu, abstraktní typ, který má veřejný konstruktor je nesprávně navržen.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, buď zamkněte konstruktor, nebo ne deklarujte typ jako abstraktní.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo. Abstraktní typ má veřejný konstruktor.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

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

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Konfigurace kódu pro analýzu

Pomocí následující možnosti nakonfigurujte, ve kterých částech základu kódu se má toto pravidlo spouštět.

Tuto možnost můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (Návrh), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.

Zahrnutí konkrétních povrchů rozhraní API

Na základě přístupnosti můžete nakonfigurovat, na kterých částech základu kódu se má toto pravidlo spouštět. Pokud chcete například určit, že pravidlo by se mělo spouštět jenom na neveřejné ploše rozhraní API, přidejte do souboru .editorconfig v projektu následující pár klíč-hodnota:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Příklad

Následující fragment kódu obsahuje abstraktní typ, který porušuje toto pravidlo.

' Violates this rule      
Public MustInherit Class Book

    Public Sub New()
    End Sub

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

Následující fragment kódu opraví předchozí porušení změnou přístupnosti konstruktoru z public na 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