5

Mam klasy jak ten:Analiza kodu VS2010. Tłumić wiadomość CA1051: DoNotDeclareVisibleInstanceFields dla wszystkich członków klasy

public class Foo 
{ 
    public readonly int A = 1; 
    public readonly int B = 2; 
} 

Kiedy biegnę VS2010 zbudowany w narzędziu Code Analysis, mam identyczne ostrzeżenia: że „pole” ... "jest widoczne poza swoim typem deklaracji, zmienia jego dostępność na prywatny i dodaje właściwość, z taką samą dostępnością, jaka obecnie jest w polu, aby zapewnić dostęp do niej".

chcę tłumić to ostrzeżenie dla wszystkich pól w mojej klasie Foo, ale nie chcę, aby zaznaczyć każde pole z SuppressMessage atrybut tak:

public class Foo 
{ 
    [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] 
    public readonly int A = 1; 
    [SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] 
    public readonly int B = 2; 
} 

Chcę zaznaczyć wszystkie elementy klasy , używając kodu takiego:

[SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")] 
public class Foo 
{ 
    public readonly int A = 1; 
    public readonly int B = 2; 
} 

Ale ten kod nie działa, nadal otrzymuję ostrzeżenie o analizie kodu. Jak zrobić to poprawnie?

+0

I że znalazłeś błąd, opublikuj na connect.microsoft.com –

+0

jakieś ostateczne rozwiązanie na ten temat? – Kiquenet

Odpowiedz

10

Nie można zablokować więcej niż jednej wiadomości naraz za pomocą funkcji SuppressMessageAttribute.

W dyskusji można znaleźć here, ale istotne jest to:

Używasz do wspólnego nieporozumienie o SuppressMessage.

Za każdym razem, gdy umieszczasz SuppressMessage w pliku źródłowym, tłumaczysz dokładnie jeden problem (jeden "wiersz" w siatce). Kropka.

Wiadomość "SuppressMessage" może być umieszczona "w pobliżu" naruszenia lub na poziomie modułu . Na poziomie modułów, na poziomie złożenia i globalnego tłumienia wszystkie te same rzeczy mają znaczenie. Umieszczając na poziomie modułu, nie można od razu tłumić wielu wystąpień problemu. Po prostu dostaniesz zlokalizować SuppressMessage w innym miejscu kodu. Główną korzyścią jest to, że można na przykład zebrać wszystkie tłumienia związane ze złożeniem w jednym pliku (na przykład: GlobalSuppressions.cs).

Podczas korzystania z funkcji SuppressMessage na poziomie modułu należy podać wartość docelową Target. Cel musi pasować dokładnie do tego, co jest zgłaszane w GUI dla z naruszeniem reguły.

Nie można użyć funkcji SuppressMessage, aby ukryć regułę dla całego zakresu klasy lub całego zakresu przestrzeni nazw.

+0

Dziękuję bardzo! Wygląda na to, że naprawdę nie zrozumiałem koncepcji SuppressMessage poprawnie! Twój ansver bardzo mi pomógł. Teraz mam pomysł. – feorex

1

Można utworzyć plik zasad CodeAnalysis z zestawem zasad, takich jak:

<?xml version="1.0" encoding="utf-8"?> 
<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0"> 
    <Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" 
     RuleNamespace="Microsoft.Rules.Managed"> 
    <Rule Id="CA1111" Action="Ignore" /> 
    </Rules> 
</RuleSet> 

patrz krok po kroku Instrukcja:

+0

Dziękuję za odpowiedź, ale nie chcę stłumić tej reguły dla całego kodu w mojej aplikacji. Czy istnieje sposób na stłumienie tej reguły tylko dla jednej klasy? – feorex

+0

@feorex: IIRC możesz zdefiniować atrybut SupressMessage dla dowolnej metody – sll