CA1822: Markera medlemmar som statiska

Egenskap Värde
Regel-ID CA1822
Title Markera medlemmar som statiska
Kategori Prestanda
Korrigeringen är brytande eller icke-brytande Icke brytande – Om medlemmen inte visas utanför sammanställningen, oavsett ändringen du gör.

Bakåtkompatibel, om du bara ändrar medlemmen till en instansmedlem med nyckelordet this.

Kompatibilitetsbrott – Om du ändrar medlemmen från en instansmedlem till en statisk medlem och den blir synlig utanför samlingen.
Aktiverad som standard i .NET 10 Som förslag
Tillämpliga språk C# och Visual Basic

Orsak

En medlem som inte har åtkomst till instansdata markeras inte som statisk (delad i Visual Basic).

Regelbeskrivning

Medlemmar som inte har åtkomst till instansdata eller anropar instansmetoder kan markeras som statiska (delade i Visual Basic). När du har markerat metoderna som statiska genererar kompilatorn icke-virtuella anropswebbplatser till dessa medlemmar. Genom att generera icke-virtuella anropsställen förhindras kontroll vid körning för varje anrop som kontrollerar att den aktuella objektpekaren inte är nul. Detta kan uppnå en mätbar prestandavinst för prestandakänslig kod. I vissa fall representerar misslyckandet med att komma åt den aktuella objektinstansen ett korrekthetsproblem.

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

Markera medlemmen som statisk (eller Delad i Visual Basic) eller använd "this"/"Me" i metodtexten, om det är lämpligt.

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");
    }
}

När du ska ignorera varningar

Det är säkert att ignorera en varning från den här regeln i följande fall:

  • För tidigare levererad kod där en fix skulle innebära en bakåtkompatibilitetsbrytande ändring.
  • För metoder i klasser som ärver från MarshalByRefObject. Metoderna i dessa klasser bör inte markeras som statiska eftersom .NET-fjärrkommunikationsinfrastrukturen använder instanssändning för att vidarebefordra anrop över AppDomain-gränser. Att göra sådana metoder statiska kan bryta fjärrkommunikation över AppDomain-gränser.

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

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

Inkludera specifika ytor för API:er

Du kan konfigurera vilka delar av kodbasen som ska köra den här regeln baserat på deras tillgänglighet genom att ange alternativet api_surface. 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

Anteckning

Ersätt den XXXX delen av CAXXXX med ID:t för den tillämpliga regeln.