2009-02-17 12 views
30

De msdn me sale esto:C#: ¿Es necesaria la restauración de advertencia de pragma?

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

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

Me gusta, si no restablezco, ¿cuánto 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?

Respuesta

35

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

Curiosamente, este comportamiento es no definido en el language specification. (ver sección 9.5.8) Sin embargo, la sección 9.5.1 en los símbolos de compilación condicional que esto indica "hasta el final del comportamiento archivo"

El símbolo permanece definida hasta que una directiva #undef para ese mismo símbolo se procesa o hasta que se llegue al final del archivo fuente .

Dada la 'pre-procesador' es en realidad parte de la fase de análisis léxico de la compilación es probable que este comportamiento es un contrato eficaz para Microsoft y todas las demás implementaciones para el futuro previsible (especialmente desde la alternativa sería enormemente complejo y no determinista basado en el orden de compilación del archivo de origen)

+1

En resumen: comportamiento no definido, así que necesitamos restaurar – Julian

2

No, encontrará que el compilador restaurará automáticamente cualquier advertencia deshabilitada 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 me he vuelto de 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, por lo que querré 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.

+0

¿Qué sucede si la advertencia ya estaba deshabilitada por un argumento de línea de comando? Terminará restaurando lo que no debería. – drowa

+0

@drowa entonces se supone que no necesita la desactivación en primer lugar. Que yo sepa, no hay nada equivalente a C++ push/pop en el compilador de C#.Entonces no hay nada mejor que esto. –

3

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

Digamos 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 la ubicación diferente en el archivo todavía activará una advertencia.

+0

Dio un caso de uso y concluyó que todos los demás casos de uso son iguales. Además, creo que esto debería haber sido un comentario en lugar de una respuesta. –

+1

@MichaWiedenmann - Estaba tratando de explicar con el ejemplo, podría haber escrito "a veces tienes dos advertencias del mismo tipo en el mismo archivo donde la primera es un falso positivo pero el segundo es un error real" - ¿Sería eso mejor? ¿responder? En mi opinión, no, la gente diría que no hay casos reales de uso en el mundo (si no dejaron de leer en "falso positivo") – Nir

Cuestiones relacionadas