Udostępnij za pośrednictwem


CA1822: Oznacz elementy członkowskie jako statyczne

Właściwości Wartość
Identyfikator reguły CA1822
Tytuł Oznaczaj składowe jako statyczne
Kategoria Wydajność
Poprawka powodująca niezgodność lub niezgodność Bez przerw — jeśli członek nie jest widoczny poza zestawem, niezależnie od wprowadzonej zmiany.

Bez rozbijania — jeśli po prostu zmienisz element członkowski na element członkowski wystąpienia za pomocą słowa kluczowego this.

Problemy — jeśli zmienisz element członkowski z wystąpienia na element członkowski statyczny i będzie widoczny poza assemblą.
Domyślnie włączone na platformie .NET 10 Jako sugestia
Zastosowane języki C# i Visual Basic

Przyczyna

Członek, który nie uzyskuje dostępu do danych wystąpienia, nie jest oznaczony jako udostępniony (w Visual Basic).

Opis reguły

Członkowie, którzy nie uzyskują dostępu do danych wystąpienia lub nie wywołują metod wystąpienia, mogą być oznaczeni jako statyczni („Shared” w Visual Basic). Po oznaczeniu metod jako statyczne kompilator wygeneruje niewirtualne wywołania dla tych członków. Emitowanie niewirtualnych miejsc wywołań zapobiegnie konieczności sprawdzania w czasie działania dla każdego wywołania, czy bieżący wskaźnik obiektu jest niezerowy. Może to osiągnąć wymierny wzrost wydajności dla kodu wrażliwego na wydajność. W niektórych przypadkach brak możliwości dostępu do aktualnego obiektu oznacza problem z poprawnością.

Jak naprawić naruszenia

Oznacz członka jako statycznego (lub Udostępnionego w Visual Basic) lub użyj 'this'/'Me' w ciele metody, jeśli jest to konieczne.

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

Kiedy pomijać ostrzeżenia

Można bezpiecznie pominąć ostrzeżenie z tej reguły w następujących przypadkach:

  • W przypadku wcześniej wysłanego kodu, dla którego poprawka byłaby zmianą powodującą niezgodność.
  • W przypadku metod w klasach, które dziedziczą z MarshalByRefObject. Metody w tych klasach nie powinny być oznaczone jako statyczne, ponieważ infrastruktura zdalnej komunikacji platformy .NET używa wywołań instancji do przekazywania połączeń przez granice AppDomain. Tworzenie takich metod statycznych może przerwać zdalną komunikację między granicami AppDomain.

Pomijanie ostrzeżenia

Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.

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

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Konfigurowanie kodu do analizowania

Użyj następującej opcji, aby skonfigurować, które części kodu mają być objęte tą regułą.

Tę opcję można skonfigurować tylko dla tej reguły, dla wszystkich reguł, do których ma ona zastosowanie, lub dla wszystkich reguł w tej kategorii (wydajność), których dotyczy. Aby uzyskać więcej informacji, zobacz Opcje konfiguracji reguły jakości kodu.

Uwzględnij określone powierzchnie interfejsu API

Możesz skonfigurować, na które części bazy kodu ma być stosowana ta reguła, na podstawie ich poziomu dostępu, ustawiając opcję api_surface. Aby na przykład określić, że reguła powinna być uruchamiana tylko na powierzchni niepublicznego interfejsu API, dodaj następującą parę klucz-wartość do pliku editorconfig w projekcie:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Notatka

Zastąp część XXXXCAXXXX identyfikatorem odpowiedniej reguły.