C#:是否需要pragma警告还原?

C#:是否需要pragma警告还原?,c#,compiler-warnings,pragma,C#,Compiler Warnings,Pragma,从中我得到: #pragma warning disable warning-list #pragma warning restore warning-list 在示例中,使用了禁用和恢复。如果我想对整个文件禁用它,是否需要还原 比如,如果我不恢复,它能走多远?之后编译的所有内容是否都禁用了警告?或者只是为了那份文件的其余部分?或者它被忽略了?否,您会发现编译器在完成对源文件的解析后会自动恢复任何禁用的警告 #pragma warning disable 649 struct MyIntero

从中我得到:

#pragma warning disable warning-list
#pragma warning restore warning-list
在示例中,使用了
禁用
恢复
。如果我想对整个文件禁用它,是否需要还原


比如,如果我不恢复,它能走多远?之后编译的所有内容是否都禁用了警告?或者只是为了那份文件的其余部分?或者它被忽略了?

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

#pragma warning disable 649
struct MyInteropThing
{
    int a;
    int b;
}
#pragma warning restore 649
在上面的示例中,我已经关闭了警告CS00649,因为我打算以不安全的方式使用此结构。编译器不会意识到我将写入具有这种布局的内存,因此我希望忽略警告:

字段“Field”从未分配给,并且始终具有其默认值“value”


但是我不想让整个文件都处于未选中状态。

如果不恢复,则对文件的其余部分禁用将处于活动状态

有趣的是,该行为未在中定义。 (见第9.5.8节)然而,9.5.1节中关于条件编译符号的部分确实指出了“直到文件结束行为”

符号保持定义状态,直到 #处理相同符号的undef指令,或直到 已到达源文件


鉴于“预处理器”实际上是编译的词法分析阶段的一部分,在可预见的未来,这种行为很可能是微软和所有其他实现的有效契约(特别是因为备选方案将非常复杂,并且基于源文件编译顺序不确定)

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

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


因此,#pragma warning的最佳用法是在导致我要抑制的警告的行之前放置一个“warning disable”,在该行之后放置一个“warning restore”,以便文件中不同位置的相同条件仍会触发警告

总而言之:行为未定义,因此我们需要恢复“源文件结尾”假设不适用于跨多个文件拆分的分部类…@McGuireV10您的意思是pragma将对其他文件中的分部类生效,还是不会生效?@TKK它似乎是“未定义的”因为这取决于编译器处理文件的顺序。它在编译器跨它运行时生效,并在显式禁用之前保持有效。文件结尾不适用于分部。您肯定要在每个文件中禁用并重新启用任何需要的文件。指向“语言规范”的链接已过时。您给出了一个用例,并得出结论,所有其他用例都是相同的。此外,我认为这应该是一个评论,而不是一个答案。@Michhawiedenmann-我试图通过例子来解释,我可以写“有时你在同一个文件中有两个相同类型的警告,第一个是假阳性,第二个是真的错误”——这是更好的答案吗?在我看来,不,人们会声称没有真实世界的用例(如果他们没有停止阅读“假阳性”),如果警告已经被命令行参数禁用了呢?您将恢复您不应该恢复的内容。@drowa那么假设您首先不需要禁用。据我所知,C语言编译器中没有C++和PUP/POP的等价物。没有比这更好的了。