C#:是否需要pragma警告恢复?

时间:2009-02-17 13:24:59

标签: c# compiler-warnings pragma

msdn我得到了这个:

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

在示例中,使用了disablerestore。如果我想要为整个文件禁用它,是否需要restore

就像,如果我不恢复,它携带多远?之后编译的所有内容都禁用警告吗?或者仅仅是该文件的其余部分?还是被忽略了?

3 个答案:

答案 0 :(得分:44)

如果您没有恢复,则对文件的其余部分禁用禁用。

有趣的是,此行为在language specification中定义为 。 (参见第9.5.8节)但是条件编译符号的9.5.1部分确实表明“直到文件结束行为”

  

符号保持定义直到a   处理相同符号的#undef指令,或直到结束   到达源文件。

鉴于'预处理器'实际上是编译词汇分析阶段的一部分,在可预见的未来,这种行为很可能是微软和所有其他实现的有效合同(特别是因为替代方案非常复杂,基于源文件编译顺序的非确定性)

答案 1 :(得分:3)

假设我有一个使用反射初始化的私有字段,编译器显然找不到直接写入此字段的任何代码,因此它会显示警告 - 我不想显示。

我们还说我有另一个私有字段,在我忘记初始化的第一行下面定义了3行,如果我禁用整个文件的警告,则不会触发警告。

因此,#pragma警告的最佳用法是在导致我要抑制的警告的行之前放置“警告禁用”,并在行之后放置“警告恢复”,以便在不同的情况下使用相同的条件文件中的位置仍会触发警告。

答案 2 :(得分:2)

不,您会发现编译器在解析完源文件后会自动恢复任何已禁用的警告。

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

在上面的例子中,我转向警告CS00649,因为我打算以不安全的方式使用这个结构。编译器不会意识到我将写入具有这种布局的内存,所以我想忽略警告:

  

字段“字段”永远不会分配给,并且始终具有默认值“值”

但我不希望整个文件不被取消选中。