c# compiler-warnings pragma

C#: ¿Es necesaria la restauración del aviso de pragma?



compiler-warnings (3)

De msdn entiendo esto:

#pragma warning disable warning-list #pragma warning restore warning-list

En los ejemplos, se usan tanto la disable como la restore . ¿Es necesario restore si lo quiero deshabilitar para un archivo completo?

Al igual que si no restaurar, ¿qué tan lejos lleva? ¿Las advertencias están deshabilitadas para todo lo compilado después de eso? ¿O solo por el resto de ese archivo? ¿O es ignorado?


Digamos que tengo un campo privado que se inicializa usando reflexiones, obviamente el compilador no puede encontrar ningún código que escriba directamente en este campo, por lo que mostrará una advertencia, que no quiero mostrar.

Digamos también que tengo otro campo privado definido 3 líneas debajo del primero que olvidé inicializar; si deshabilito la advertencia para todo el archivo, esto no generará una advertencia.

Entonces, el mejor uso para la advertencia de #pragma es poner una "advertencia desactivada" justo antes de la línea que causa la advertencia que quiero suprimir y una "restauración de advertencia" justo después de la línea para que la misma condición en una ubicación diferente en el archivo todavía activará una advertencia.


Si no restaura, la desactivación está activa para el resto del archivo.

Curiosamente, este comportamiento no está definido en la especificación del lenguaje . (Consulte la sección 9.5.8) Sin embargo, la sección 9.5.1 sobre símbolos de compilación condicional indica esto "hasta el final del comportamiento del archivo"

El símbolo permanece definido hasta que se procesa una directiva #undef para ese mismo símbolo, o hasta que se llega al final del archivo de origen.

Dado que el "pre-procesador" es en realidad parte de la fase de compilación de análisis léxico, es probable que este comportamiento sea un contrato eficaz para las implementaciones de Microsoft y todas las demás en el futuro previsible (especialmente dado que la alternativa sería muy compleja y no determinista). en el orden de compilación del archivo fuente)


No, encontrará que el compilador restaurará automáticamente cualquier advertencia desactivada una vez que haya terminado de analizar un archivo fuente.

#pragma warning disable 649 struct MyInteropThing { int a; int b; } #pragma warning restore 649

En el ejemplo anterior he activado la advertencia CS00649 porque tengo la intención de utilizar esta estructura de una manera insegura. El compilador no se dará cuenta de que escribiré en la memoria que tiene este tipo de diseño, así que quiero ignorar la advertencia:

El campo ''campo'' nunca se asigna a, y siempre tendrá su valor predeterminado ''valor''

Pero no quiero que el archivo completo no se deje sin marcar.