Pomijanie naruszeń analizy kodu

Jeśli współpracujesz z zespołem podczas tworzenia kodu, często warto wskazać, że ostrzeżenie nie ma zastosowania. Pomijanie naruszeń analizy kodu wskazuje członkom zespołu, że kod został sprawdzony, a ostrzeżenie może zostać pominięte. W poniższych sekcjach opisano różne sposoby pomijania naruszeń analizy kodu przy użyciu środowiska IDE programu Visual Studio.

Pomijanie naruszeń przy użyciu pliku EditorConfig

W pliku EditorConfig dla rozwiązania lub projektu dodaj wpis dla każdej reguły, którą chcesz skonfigurować i ustawić jej ważność na none. Na przykład dotnet_diagnostic.CA1822.severity = none. Aby uzyskać więcej informacji, zobacz Ręczne konfigurowanie ważności reguły w pliku EditorConfig. Aby dodać plik EditorConfig, zobacz Dodawanie pliku EditorConfig do projektu.

Pomijanie naruszeń w kodzie źródłowym

Naruszenia kodu źródłowego można pominąć przy użyciu dyrektywy preprocesora, która pomija naruszenia określonego wiersza kodu:

Możesz też użyć atrybutu SuppressMessageAttribute, aby pominąć ostrzeżenie w kodzie C# i Visual Basic.

Pomijanie naruszeń przy użyciu edytora kodu

Aby pominąć naruszenia przy użyciu edytora kodu, wykonaj następujące kroki:

  1. Umieść kursor w wierszu kodu z naruszeniem i naciśnij klawisze Ctrl+Period (.) lub Alt+Enter, aby otworzyć menu Szybkie akcje.

  2. Wybierz pozycję Pomiń lub skonfiguruj problemy>Pomiń <numer> reguły, a następnie wybierz pozycję Źródło lub Źródło (atrybut).

    • Jeśli wybierzesz pozycję Źródło, zostanie wyświetlona wersja zapoznawcza dyrektywy preprocesora dodana do kodu.

      Zrzut ekranu przedstawiający wybór źródła z menu Szybkie akcje Pomiń.

    • W przypadku wybrania opcji Źródło (atrybut) zostanie wyświetlony podgląd atrybutu SuppressMessageAttribute dodanego do kodu.

      Zrzut ekranu przedstawiający wybór opcji Źródło (atrybut) z menu Szybkie akcje Pomijanie.

Pomijanie naruszeń przy użyciu listy błędów

Aby pominąć naruszenia przy użyciu okna Lista błędów, wykonaj następujące kroki:

  1. W oknie Lista błędów wybierz reguły, które chcesz pominąć.

  2. Kliknij prawym przyciskiem myszy, a następnie wybierz pozycję Pomiń>w źródle.

    Zostanie otwarte okno dialogowe Podgląd zmian i zostanie wyświetlona wersja zapoznawcza dyrektywy ostrzeżenia #pragma języka C# lub dyrektywy ostrzeżenia #Disable Visual Basic dodanej do kodu źródłowego.

    Zrzut ekranu przedstawiający okno dialogowe Podgląd zmian w celu dodania #pragma ostrzeżeń w pliku kodu.

  3. Wybierz pozycję Zastosuj , aby zapisać zmiany w pliku kodu.

Diagnostyka kompilacji wyklucz listę błędów

Jeśli nie widzisz opcji menu Pomijaj w oknie Lista błędów, naruszenie prawdopodobnie pochodzi z kompilacji, a nie analizy na żywo. W oknie Lista błędów jest wyświetlana diagnostyka lub naruszenia reguł zarówno z analizy kodu na żywo, jak i kompilacji. Ponieważ diagnostyka kompilacji może być nieaktualna, na przykład jeśli edytowano kod w celu naprawienia naruszenia, ale nie został ponownie skompilowany, nie zawsze można pominąć te dane diagnostyczne z listy błędów.

Diagnostyka z analizy na żywo lub funkcji IntelliSense są zawsze aktualne z bieżącymi źródłami i zawsze mogą być pomijane z listy błędów. Aby wykluczyć diagnostykę kompilacji z wybranego obszaru, wykonaj następujące kroki:

  1. Z listy rozwijanej Filtr źródła listy błędów zmień wybór z Build + IntelliSense tylko na IntelliSense.

    Zrzut ekranu przedstawiający filtr źródła listy błędów.

  2. Wybierz diagnostykę, którą chcesz pominąć, i kontynuuj zgodnie z wcześniejszym opisem.

Pomijanie naruszeń przy użyciu globalnego pliku pomijania

Globalny plik pomijania używa atrybutu SuppressMessageAttribute do pomijania naruszeń kodu.

Używanie globalnego pliku pomijania z edytora kodu

Aby pominąć naruszenia globalnego pliku pomijania przy użyciu edytora kodu, wykonaj następujące kroki:

  1. W edytorze kodu umieść kursor w wierszu kodu z naruszeniem i naciśnij klawisze Ctrl+Period (.) lub Alt+Enter, aby otworzyć menu Szybkie akcje.

  2. Wybierz pozycję Pomiń <numer> reguły, a następnie w obszarze Pomijanie pliku.

    Program Visual Studio tworzy kartę w edytorze kodu zawierającym nowy globalny plik pomijania.

Używanie globalnego pliku pomijania z listy błędów

Aby pominąć naruszenia globalnego pliku pomijania przy użyciu okna Lista błędów, wykonaj następujące kroki:

  1. W oknie Lista błędów wybierz reguły, które chcesz pominąć.

  2. Kliknij prawym przyciskiem myszy, a następnie wybierz pozycję Pomiń>w pliku pomijania.

    Zostanie otwarte okno dialogowe Podgląd zmian i zostanie wyświetlony podgląd atrybutu SuppressMessageAttribute dodanego do pliku globalnego pomijania.

    Zrzut ekranu przedstawiający okno dialogowe Podgląd zmian z atrybutem SuppressMessageAttribute w pliku pomijania.

  3. Wybierz pozycję Zastosuj , aby zapisać globalny plik pomijania.

Pomijanie wszystkich bieżących naruszeń

Pomijanie wszystkich bieżących naruszeń jest czasami określane jako podstawy. Aby pominąć wszystkie bieżące naruszenia w rozwiązaniu lub projekcie, wykonaj następujące kroki:

  1. Na pasku menu programu Visual Studio wybierz pozycję Analizuj>kompilację i pomiń aktywne problemy.

  2. Wybierz pozycję Aby rozwiązać problem , aby pominąć naruszenia dla całego rozwiązania, lub wybierz pozycję Aby <nazwa projektu> pomijała naruszenia tylko dla projektu.

Pomijanie naruszeń przy użyciu ustawień projektu

Aby pominąć naruszenia przy użyciu ustawień projektu Eksplorator rozwiązań, wykonaj następujące kroki:

  1. W Eksplorator rozwiązań wybierz projekt.

  2. Kliknij prawym przyciskiem myszy, a następnie wybierz pozycję Właściwości (lub naciśnij klawisze Alt + Enter).

  3. W oknie Właściwości wybierz pozycję Analiza kodu w okienku po lewej stronie, a następnie wyczyść pole Wyboru Pomiń wyniki z wygenerowanego kodu.

Pomijanie naruszeń przy użyciu zestawu reguł

W edytorze zestawu reguł wyczyść pole wyboru obok jego nazwy lub ustaw opcję Akcja na Brak.

Pomijanie w źródle i atrybut SuppressMessageAttribute

Pomijanie w źródle (ISS) używa atrybutu SuppressMessageAttribute do pomijania ostrzeżenia. Atrybut można dodać SuppressMessageAttribute do pliku źródłowego w pobliżu segmentu kodu, który wygenerował ostrzeżenie.

Możesz ręcznie wprowadzić atrybut w edytorze kodu lub dodać atrybut automatycznie w następujący sposób:

  1. W edytorze kodu umieść kursor w wierszu kodu z naruszeniem i naciśnij klawisze Ctrl+Period (.) lub Alt+Enter, aby otworzyć menu Szybkie akcje.

  2. Wybierz pozycję Pomiń lub skonfiguruj problemy>Pomiń <numer> reguły z menu Szybkie akcje.

  3. Wykonaj jeden z następujących kroków:

    • Wybierz pozycję Source (attribute).

      Program Visual Studio dodaje SuppressMessageAttribute atrybut do kodu.

    • Wybierz pozycję w pliku pomijania.

      Program Visual Studio tworzy kartę w edytorze kodu zawierającą nowy globalny plik pomijania z atrybutami SuppressMessageAttribute .

Atrybut SuppressMessageAttribute jest atrybutem warunkowym, który znajduje się w metadanych zestawu kodu zarządzanego. Ten atrybut jest uwzględniany tylko wtedy, gdy CODE_ANALYSIS symbol kompilacji jest zdefiniowany w czasie kompilacji.

Tylko w kodzie języka C++ i interfejsu wiersza polecenia użyj makr CA_SUPPRESS_MESSAGE lub CA_GLOBAL_SUPPRESS_MESSAGE w pliku nagłówka, aby dodać atrybut.

W przypadku migracji projektu do najnowszej wersji programu Visual Studio może zostać wyświetlona duża liczba ostrzeżeń dotyczących analizy kodu. Jeśli nie jesteś gotowy do naprawienia ostrzeżeń, możesz je pominąć, wybierając pozycję Analizuj>kompilację i pomiń aktywne problemy.

Uwaga

Nie używaj pomijań w źródle w kompilacjach wydania, aby zapobiec przypadkowemu wysłaniu metadanych pomijania w źródle.

SuppressMessageAttribute, format atrybutu

Atrybut SuppressMessageAttribute ma następujący format:

[Scope:SuppressMessage("Rule Category", "Rule Id", Justification = "Justification", MessageId = "MessageId", Scope = "Scope", Target = "Target")]

Właściwości atrybutu obejmują:

  • Category: kategoria reguły. Aby uzyskać więcej informacji na temat kategorii reguł analizy kodu, zobacz Reguły jakości kodu.

  • CheckId: Identyfikator reguły. Obsługa obejmuje zarówno krótką, jak i długą nazwę identyfikatora reguły. Krótka nazwa to CAXXXX; długa nazwa to CAXXXX:FriendlyTypeName.

  • Justification: tekst używany do dokumentowania przyczyny pomijania wiadomości.

  • MessageId: unikatowy identyfikator problemu dla każdego komunikatu.

  • Scope: element docelowy, na którym jest pomijane ostrzeżenie. Jeśli element docelowy nie jest określony, system ustawia go na element docelowy atrybutu. Obsługiwane zakresy obejmują:

    • module: ten zakres pomija ostrzeżenia dotyczące zestawu. Jest to globalne pomijanie, które ma zastosowanie do całego projektu.

    • resource: (Tylko starsza wersja FxCop ) Ten zakres pomija ostrzeżenia w informacjach diagnostycznych zapisanych w plikach zasobów, które są częścią modułu (zestawu). Ten zakres nie jest odczytywany ani uwzględniany w kompilatorach języka C#/VB dla diagnostyki analizatora Roslyn, która analizuje tylko pliki źródłowe.

    • type: ten zakres pomija ostrzeżenia dotyczące typu.

    • member: ten zakres pomija ostrzeżenia dotyczące elementu członkowskiego.

    • namespace: ten zakres pomija ostrzeżenia dotyczące samej przestrzeni nazw. Nie pomija ostrzeżeń dotyczących typów w przestrzeni nazw.

    • namespaceanddescendants: (Wymaga kompilatora w wersji 3.x lub nowszej i programu Visual Studio 2019 lub nowszej) Ten zakres pomija ostrzeżenia w przestrzeni nazw i wszystkich symbolach potomnych. Analiza w starszej namespaceanddescendants wersji ignoruje wartość.

  • Target: identyfikator określający docelowy, na którym jest pomijane ostrzeżenie. Musi zawierać w pełni kwalifikowaną nazwę składnika.

Po wyświetleniu ostrzeżeń w programie Visual Studio możesz wyświetlić przykłady SuppressMessageAttribute , dodając pomijanie do globalnego pliku pomijania. Atrybut pomijania i jego wymagane właściwości są wyświetlane w oknie podglądu.

SuppressMessageAttribute użycie

Ostrzeżenia analizy kodu są pomijane na poziomie, na którym SuppressMessageAttribute jest stosowany atrybut. Na przykład atrybut można zastosować na poziomie zestawu, modułu, typu, elementu członkowskiego lub parametru. Celem zastosowania tego atrybutu jest ścisłe połączenie informacji pomijania do kodu, w którym występuje naruszenie.

Ogólna forma pomijania obejmuje kategorię reguł i identyfikator reguły, który zawiera opcjonalną czytelną dla człowieka reprezentację nazwy reguły. Na przykład:

[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]

Jeśli istnieją ścisłe przyczyny wydajności minimalizacji metadanych pomijania źródła, nazwa reguły może zostać pominięta. Kategoria reguły i jej identyfikator reguły razem tworzą wystarczająco unikatowy identyfikator reguły. Na przykład:

[SuppressMessage("Microsoft.Design", "CA1039")]

Ze względów konserwacji pominięcie nazwy reguły nie jest zalecane.

Pomijanie naruszeń selektywnych w treści metody

Atrybuty pomijania można zastosować do metody, ale nie można ich osadzać w treści metody. Wszystkie naruszenia określonej reguły są pomijane w przypadku dodania atrybutu SuppressMessageAttribute do metody .

W niektórych przypadkach możesz pominąć określone wystąpienie naruszenia. Rozważmy przykład, w którym przyszły kod nie jest automatycznie wykluczony z reguły analizy kodu. Niektóre reguły analizy kodu umożliwiają pomijanie określonego wystąpienia naruszenia przy użyciu MessageId właściwości atrybutu SuppressMessageAttribute . Ogólnie rzecz biorąc, starsze reguły naruszeń określonego symbolu (zmiennej lokalnej lub parametru) przestrzegają MessageId właściwości. CA1500:VariableNamesShouldNotMatchFieldNames jest przykładem takiej reguły. Jednak starsze reguły naruszeń kodu wykonywalnego (bez symboli) nie są zgodne z właściwością MessageId . Ponadto analizatory platformy kompilatora .NET ("Roslyn") nie szanują MessageId właściwości.

Aby pominąć naruszenie określonego symbolu reguły, określ nazwę symbolu właściwości MessageId atrybutu SuppressMessageAttribute . W poniższym przykładzie pokazano kod z dwoma naruszeniami ca1500:VariableNamesShouldNotMatchFieldNames: jedno naruszenie name zmiennej i inne naruszenie zmiennej age . Pomijane jest tylko naruszenie symbolu age .

public class Animal
{
    int age;
    string name;

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1500:VariableNamesShouldNotMatchFieldNames", MessageId = "age")]
    private void PrintInfo()
    {
        int age = 5;
        string name = "Charlie";

        Console.WriteLine($"Age {age}, Name {name}");
    }
}

Pomijania na poziomie globalnym

Narzędzie do analizy kodu zarządzanego SuppressMessageAttribute sprawdza atrybuty, które są stosowane na poziomie zestawu, modułu, typu, elementu członkowskiego lub parametru. Przesyła również naruszenia zasobów i przestrzeni nazw. Te naruszenia muszą być stosowane na poziomie globalnym i są objęte zakresem i celem. Na przykład następujący komunikat pomija naruszenie przestrzeni nazw:

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

W przypadku pomijań na poziomie globalnym:

  • Po pomijaniu ostrzeżenia z zakresem namespace pomija ostrzeżenie przed samą przestrzenią nazw. Nie pomija ostrzeżenia przed typami w przestrzeni nazw.

  • Target zawsze zawiera w pełni kwalifikowaną nazwę elementu.

  • Wszelkie pomijanie można wyrazić, określając jawny zakres. Te pomijania muszą istnieć na poziomie globalnym. Nie można określić pomijania na poziomie elementu członkowskiego, modyfikując typ.

  • Pomijania na poziomie globalnym to jedyny sposób pomijania komunikatów odwołujących się do kodu generowanego przez kompilator, który nie jest mapowany na jawne źródło użytkownika. Na przykład poniższy kod pomija naruszenie względem konstruktora emitowanego przez kompilator:

    [module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

Globalny plik pomijania

Globalny plik pomijania utrzymuje pomijania, które są pomijaniami na poziomie globalnym lub pomijaniami, które nie określają elementu docelowego. Na przykład pomijanie naruszeń na poziomie zestawu jest przechowywane w tym pliku. Ponadto niektóre ASP.NET pomijania są przechowywane w tym pliku, ponieważ ustawienia na poziomie projektu nie są dostępne dla kodu za formularzem. Program Visual Studio tworzy i dodaje do projektu globalny plik pomijania przy pierwszym wybraniu opcji W pliku pomijania projektu w oknie Lista błędów.

Zakres pomijania modułu

Można pominąć naruszenia jakości kodu dla całego zestawu przy użyciu module zakresu.

Na przykład następujący atrybut w pliku projektu GlobalSuppressions pomija naruszenie ConfigureAwait dla projektu ASP.NET Core:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Reliability", "CA2007:Consider calling ConfigureAwait on the awaited task", Justification = "ASP.NET Core doesn't use thread context to store request context.", Scope = "module")]

Wygenerowany kod

Kompilatory kodu zarządzanego i niektóre narzędzia zewnętrzne generują kod, aby ułatwić szybkie tworzenie kodu. Wygenerowany przez kompilator kod wyświetlany w plikach źródłowych jest oznaczony atrybutem GeneratedCodeAttribute .

W przypadku analizy kodu źródłowego można pominąć komunikaty w wygenerowanym kodzie w pliku editorconfig . Aby uzyskać więcej informacji, zobacz Wykluczanie wygenerowanego kodu.

W przypadku starszej analizy kodu można wybrać, czy pomijać ostrzeżenia analizy kodu i błędy dla wygenerowanego kodu. Aby uzyskać informacje na temat pomijania takich ostrzeżeń i błędów, zobacz Pomijanie ostrzeżeń analizy kodu dla wygenerowanego kodu.

Uwaga

Analiza kodu ignoruje GeneratedCodeAttribute zastosowanie go do całego zestawu lub pojedynczego parametru.