Delen via


CA1822: Leden markeren als statisch

Eigenschap Waarde
Regel-id CA1822
Titel Leden markeren als statisch
Categorie Prestaties
Fix kan brekend of niet-brekend zijn Niet-brekend: als het onderdeel niet zichtbaar is buiten de assemblage, ongeacht de wijziging die u aanbrengt.

Niet-onderbrekend, als u alleen het lid wijzigt in een instantiemember met het this sleutelwoord.

Fouten veroorzaken: als u het lid wijzigt van een exemplaarlid in een statisch lid en zichtbaar is buiten de assembly.
Standaard ingeschakeld in .NET 10 Als suggestie
Toepasselijke talen C# en Visual Basic

Oorzaak

Een lid dat geen toegang heeft tot exemplaargegevens, wordt niet gemarkeerd als statisch (Gedeeld in Visual Basic).

Beschrijving van regel

Leden die geen toegang hebben tot exemplaargegevens of methoden voor aanroepen van exemplaren, kunnen worden gemarkeerd als statisch (gedeeld in Visual Basic). Nadat u de methoden als statisch hebt gemarkeerd, verzendt de compiler niet-virtuele aanroepsites naar deze leden. Het verzenden van niet-virtuele oproepsites voorkomt een controle tijdens runtime voor elke aanroep die ervoor zorgt dat de huidige objectpointer niet null is. Dit kan een meetbare prestatiewinst bereiken voor prestatiegevoelige code. In sommige gevallen vertegenwoordigt de fout bij de toegang tot de huidige objectinstantie een juistheidsprobleem.

Hoe schendingen op te lossen

Markeer het lid als statisch (of gedeeld in Visual Basic) of gebruik 'this'/'Me' in de hoofdtekst van de methode, indien van toepassing.

Example

public class Printer
{
    private readonly List<char> _items = [
        'H', 'e', 'l', 'l', 'o',
    ];

    public void PrintHello()
    {
        BadPrintHelloInternal();
        GoodPrintHelloInternal();
        GoodPrintHelloStaticInternal();
    }

    // This method violates the rule.
    private void BadPrintHelloInternal()
    {
        Console.WriteLine("Hello");
    }

    // This methods satisfies the rule.
    private void GoodPrintHelloInternal()
    {
        Console.WriteLine(string.Join(string.Empty, this._items));
    }

    private static void GoodPrintHelloStaticInternal()
    {
        Console.WriteLine("Hello");
    }
}

Wanneer waarschuwingen onderdrukken

In de volgende gevallen is het veilig om een waarschuwing van deze regel te onderdrukken:

  • Voor eerder verzonden code waarvoor de oplossing een belangrijke wijziging zou zijn.
  • Voor methoden in klassen die overnemen van MarshalByRefObject. De methoden in deze klassen mogen niet als statisch worden gemarkeerd, omdat de externe infrastructuur van .NET gebruikmaakt van instantie-verzending om aanroepen door te sturen naar andere AppDomain-grenzen. Door dergelijke methoden statisch te maken, kan externe communicatie tussen AppDomain-grenzen worden verbroken.

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

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.CA1822.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.

Specifieke API-oppervlakken opnemen

U kunt configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid, door de optie api_surface in te stellen. 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

Notitie

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