5

que tengo una clase como ésta:Análisis del código VS2010. Eliminar mensaje CA1051: DoNotDeclareVisibleInstanceFields para todos los miembros de la clase

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

Cuando corro VS2010 construido en la herramienta de análisis de código, consigo advertencias idénticas: que 'campo' ... 'es visible fuera de su tipo de declaración, cambie su accesibilidad a privado y agregue una propiedad, con la misma accesibilidad que el campo en este momento, para proporcionar acceso al mismo'.

que desea suprimir esta advertencia para todos los campos de mi clase Foo, pero no quiero marcar cada campo con SuppressMessage atributo de la siguiente manera:

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

Quiero marcar todos los miembros de la clase , usando código como este:

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

Pero este código no funciona, todavía me aparece una advertencia de análisis de código. ¿Cómo puedo hacerlo correctamente?

+0

I Creo que encontraste un error, publica en connect.microsoft.com –

+0

¿alguna solución final al respecto? – Kiquenet

Respuesta

10

No hay ninguna manera de suprimir más de 1 mensaje a la vez usando SuppressMessageAttribute.

Como la discusión se puede encontrar here, pero la parte pertinente es:

está ejecutando en un malentendido común acerca SuppressMessage.

Cada vez que coloca un SuppressMessage en un archivo fuente, suprime exactamente un problema (una "fila" en la cuadrícula). Período.

Un SuppressMessage puede colocarse "cerca" de la violación o en el nivel de módulo . El nivel de módulo, el nivel de ensamblaje y la supresión global significan lo mismo. Al colocar en el nivel del módulo, no se se suprimen varias instancias del problema a la vez. Simplemente llega al localiza el mensaje SuppressMessage en un lugar diferente del código. La principal beneficio es que se puede, por ejemplo, recoger todas las supresiones relacionados con el conjunto en un solo archivo (por ejemplo, GlobalSuppressions.cs).

Cuando se utiliza un SuppressMessage de nivel de módulo, debe especificar el destino . El objetivo debe coincidir exactamente con lo que se informa en la GUI para , una violación de la regla.

No hay forma de que utilice SuppressMessage para suprimir una regla para el alcance completo de una clase o el ámbito completo de un espacio de nombres.

+0

¡Muchas gracias! ¡Parece que realmente no entendí el concepto de SuppressMessage correctamente! Su respuesta me ayudó mucho. Ahora tengo la idea. – feorex

1

Puede crear el archivo de reglas CodeAnalysis con un conjunto de reglas como:

<?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> 

ver paso a paso tutorial:

+0

Gracias por su respuesta, pero no quiero suprimir esta regla para todo el código en mi aplicación. ¿Hay alguna manera de suprimir esta regla solo para una clase? – feorex

+0

@feorex: IIRC puede definir el atributo SupressMessage para cualquier método en particular – sll

Cuestiones relacionadas