Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| 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.