在 c# 中使用 #line 指令来更改错误或警告的默认行号的原因是啥?

Posted

技术标签:

【中文标题】在 c# 中使用 #line 指令来更改错误或警告的默认行号的原因是啥?【英文标题】:What is the reason behind using the #line directive in c# to change the error or warning's default line number?在 c# 中使用 #line 指令来更改错误或警告的默认行号的原因是什么? 【发布时间】:2020-09-22 00:53:21 【问题描述】:

我正在阅读有关 C# 中#line 指令的 Microsoft 网页 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-line。它解释说 #line 200 指令强制下一行的编号为 200(尽管默认值为 #6),直到 #line 默认指令将行编号返回为其默认编号。

我的问题是为什么我们需要更改代码中的错误或警告的行号?

class MainClass

    static void Main()
    
#line 200 "Special"
        int i;
        int j;
#line default
        char c;
        float f;
#line hidden // numbering not affected
        string s;
        double d;
    

编译产生以下输出:

Special(200,13): warning CS0168: The variable 'i' is declared but never used
Special(201,13): warning CS0168: The variable 'j' is declared but never used
MainClass.cs(9,14): warning CS0168: The variable 'c' is declared but never used
MainClass.cs(10,15): warning CS0168: The variable 'f' is declared but never used
MainClass.cs(12,16): warning CS0168: The variable 's' is declared but never used
MainClass.cs(13,16): warning CS0168: The variable 'd' is declared but never used

【问题讨论】:

有趣的问题。做了一个谷歌,发现this。代码生成工具看起来是这个的大消费者。 如果你需要它,你就会知道你需要它。询问某人如何使用勺子是没有意义和徒劳的,有很多用途。文档中的注释也为您提供了一个完美的例子 docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 谢谢@Steve,这是一个有用的链接。 @MichaelRandall,阅读这篇文章是我的 c# 课程的作业。我相信如果我不知道学习的原因,我很快就会忘记它,这将毫无意义。这就是我问这个问题的原因。感谢您的评论。 【参考方案1】:

此指令在许多场景中很有用,其中大多数 C# 开发人员从未见过。

我知道的所有场景都涉及由其他进程生成或修改的 C# 文件,并且 #line 指令用于确保文件编译版本的 .pdb 信息提供与原始输入相关的准确信息。

The documentation page you've been referred 以他们的例子暗示了这一点。他们设想了一个构建步骤,该步骤在编译结果之前从原始 C# 文件中删除(删除)行。如果调试信息显示的是已处理的行号而不是原始的行号,那么尝试调试该代码的人会遇到困难,因为当他们调试时,他们可能会查看原始编写的文件,而不是修改后的预处理文件。

我知道的其他示例包括 T4 处理的输出,以及编译 XAML 文件时生成的 C# 文件。在这些情况下,没有原始 C# 文件,但有原始创作文件,如果有异常或其他原因将行号传达给尝试调试代码的人,他们会想从原始文件,而不是他们可能永远不会看到的生成文件。

【讨论】:

以上是关于在 c# 中使用 #line 指令来更改错误或警告的默认行号的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

灵活警告多字符字符常量

7.5 pragma 指令

C#错误:未能找到类型或命名空间名称“MessageBoxResult”(是不是缺少 using 指令或程序集引用?)怎么办??

预处理指令

当在C#中使用System指令时,找不到类型或名称空间名称'Text'

在 Razor 页面中使用 @functions 块的错误和警告