С#: Требуется ли восстановление прагмы?

От msdn Я получаю следующее:

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

В примерах используются как disable, так и restore. Нужно ли restore, если я хочу, чтобы он был отключен для целого файла?

Как, если я не восстанавливаю, насколько он переносится? Запрещены ли предупреждения для всего, что скомпилировано после этого? Или просто для остальной части этого файла? Или это игнорируется?

Ответ 1

Если вы не восстановите, то отключение будет активным для оставшейся части файла.

Интересно, что это поведение не определено в языковой спецификации. (см. раздел 9.5.8). Однако раздел 9.5.1 на условных символах компиляции указывает это "до конца поведения файла"

Символ остается определенным до тех пор, пока Директива #undef для этого же символа обрабатывается или до конца исходный файл.

Учитывая, что "предварительный процессор" на самом деле является частью фазы компиляции лексического анализа, вполне вероятно, что это поведение является эффективным контрактом для Microsoft и всех других реализаций в обозримом будущем (тем более, что альтернативный вариант был бы чрезвычайно сложным и не детерминированный на основе порядка компиляции исходного файла)

Ответ 2

Скажем, у меня есть частное поле, которое инициализируется с помощью отражений, компилятор, очевидно, не может найти какой-либо код, непосредственно записывающий в это поле, поэтому он покажет предупреждение, которое я не хочу показывать.

Предположим также, что у меня есть другое частное поле, определяющее 3 строки ниже первого, что я забыл инициализировать, если отключить предупреждение для всего файла, это не вызовет предупреждения.

Итак, лучшее использование для предупреждения #pragma - это поставить "предупреждение отключить" прямо перед строкой, которая вызывает предупреждение, которое я хочу подавить, и "предупреждение восстановить" сразу после строки, так что одно и то же условие в другой местоположение в файле все равно вызовет предупреждение.

Ответ 3

Нет, вы обнаружите, что компилятор автоматически восстановит любое отключенное предупреждение после завершения анализа исходного файла.

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

В приведенном выше примере я превратил предупреждение CS00649, потому что намерен использовать эту структуру небезопасно. Компилятор не поймет, что я буду писать в память с таким макетом, поэтому я хочу проигнорировать предупреждение:

Поле 'field' никогда не назначается и всегда будет иметь значение по умолчанию 'value'

Но я не хочу, чтобы весь файл не был удален.