Share via


CA1052: Statische houdertypen moeten statisch of nietheriteerbaar zijn

Eigenschappen Weergegeven als
Regel-id CA1052
Titel Statische houdertypen moeten statisch of nietheriteerbaar zijn
Categorie Ontwerpen
Oplossing is brekend of niet-brekend Breken
Standaard ingeschakeld in .NET 9 Nee

Oorzaak

Een niet-abstract type bevat alleen statische leden (behalve een mogelijke standaardconstructor) en wordt niet gedeclareerd met de statische of gedeelde modifier.

Deze regel kijkt standaard alleen naar extern zichtbare typen, maar dit kan worden geconfigureerd.

Beschrijving van regel

Bij regel CA1052 wordt ervan uitgegaan dat een type dat alleen statische leden bevat, niet is ontworpen om te worden overgenomen, omdat het type geen functionaliteit biedt die kan worden overschreven in een afgeleid type. Een type dat niet moet worden overgenomen, moet worden gemarkeerd met de static modifier in C# om het gebruik ervan als basistype te verbieden. Daarnaast moet de standaardconstructor worden verwijderd. In Visual Basic moet de klasse worden geconverteerd naar een module.

Deze regel wordt niet geactiveerd voor abstracte klassen of klassen die een basisklasse hebben. De regel wordt echter geactiveerd voor klassen die ondersteuning bieden voor een lege interface.

Notitie

In de nieuwste analyse-implementatie van deze regel omvat deze ook de functionaliteit van regel CA1053.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, markeert u het type als static en verwijdert u de standaardconstructor (C#) of converteert u deze naar een module (Visual Basic).

Wanneer waarschuwingen onderdrukken

In de volgende gevallen kunt u schendingen onderdrukken:

  • Het type is ontworpen om te worden overgenomen. Het ontbreken van de static wijzigingsfunctie geeft aan dat het type nuttig is als basistype.
  • Het type wordt gebruikt als een typeargument. Statische typen kunnen niet worden gebruikt als typeargumenten.

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

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.CA1052.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 (ontwerp) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.

Specifieke API-oppervlakken opnemen

U kunt instellen op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid. Als u bijvoorbeeld wilt opgeven dat de regel alleen moet worden uitgevoerd op het niet-openbare API-oppervlak, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Voorbeeld van een schending

In het volgende voorbeeld ziet u een type dat de regel schendt:

public class StaticMembers
{
    public static int SomeProperty { get; set; }
    public static void SomeMethod() { }
}
Imports System

Namespace ca1052

    Public Class StaticMembers

        Shared Property SomeProperty As Integer

        Private Sub New()
        End Sub

        Shared Sub SomeMethod()
        End Sub

    End Class

End Namespace

Oplossing met de statische wijziging

In het volgende voorbeeld ziet u hoe u een schending van deze regel kunt oplossen door het type te markeren met de static wijzigingsfunctie in C#:

public static class StaticMembers
{
    public static int SomeProperty { get; set; }
    public static void SomeMethod() { }
}