C#预处理指令之#line,#pragma warning 详细解析

 更新时间:2014年01月16日 08:52:34   作者:  
#line 指令可能由生成过程中的自动中间步骤使用。例如,如果行从原始的源代码文件中移除,但是您仍希望编译器基于文件中的原始行号生成输出,则可以移除行,然后用 #line 模拟原始行号

#line
#line 使您可以修改编译器的行号以及(可选)错误和警告的文件名输出。下面的示例说明如何报告与行号关联的两个警告。#line 200 指令强迫行号为 200(尽管默认值为 #7)。另一行 (#9) 作为默认 #line 指令的结果跟在通常序列后。

复制代码 代码如下:

class MainClass
{
     static void Main()
     {
         #line 200
         int i; // CS0168 on line 200
         #line default
         char c; // CS0168 on line 9
      }
}

备注:
#line 指令可能由生成过程中的自动中间步骤使用。例如,如果行从原始的源代码文件中移除,但是您仍希望编译器基于文件中的原始行号生成输出,则可以移除行,然后用 #line 模拟原始行号。 #line hidden 指令对调试器隐藏若干连续的行,这样当开发人员在逐句通过代码时,将会跳过 #line hidden 和下一个 #line 指令(假定它不是另一个 #line hidden 指令)之间的所有行。此选项也可用来使 ASP.NET 能够区分用户定义的代码和计算机生成的代码。尽管 ASP.NET 是此功能的主要使用者,但很可能将有更多的源生成器使用它。

#line hidden 指令不会影响错误报告中的文件名或行号。即,如果在隐藏块中遇到错误,编译器将报告当前文件名和错误的行号。

#line filename 指令指定您希望出现在编译器输出中的文件名。默认情况下,使用源代码文件的实际名称。文件名必须括在双引号 ("") 中。 源代码文件可以具有 #line 指令的任何编号。

示例
下面的示例说明调试器如何忽略代码中的隐藏行。运行此示例时,它将显示三行文本。但是,当设置如示例所示的断点并按 F10 键逐句通过代码时,您将看到调试器忽略了隐藏行。还请注意,即使在隐藏行上设置断点,调试器仍会忽略它。

复制代码 代码如下:

// preprocessor_linehidden.cs
using System;
class MainClass
{
      static void Main()
      {
           Console.WriteLine("Normal line #1."); //这里设置断点
           #line hidden
           Console.WriteLine("Hidden line.");
          #line default
          Console.WriteLine("Normal line #2.");
       }
}

#pragma warning指令:允许我们关闭及重新开启警告消息

在日常开发的过程中我们总是会经常对代码进行编译,而在编译的过程中会出现许多信息,许多无用的警告信息总是会在便一点过程中提示出来,以干扰一些主要的警告,对此也是可以通过预处理器指令来进行关闭来阻止其显示,常见的警告如下(CS0219、CS0681等):

看一个例子:

复制代码 代码如下:

public class C
{
    int i = 10;//警告:C.i已赋值,但从未使用过它的值

    [Obsolete("过期了",false)]
    public static void aa()
    {

    }


    static void Main()
    {
        int t=5; //警告:t已赋值,但其值从未使用
        aa(); //警告:过期了

    }
}


编译生成消息如下:

注意:我所使用的是vs2010如果多次编译会自动将警告去除,如希望确保警告在输出中被显示,可以为项目做下清理:

清理的作用就是将之前在bin目录中的程序集文件删除

如果我们希望不显示上图红框内的警告,我们可以用#pragma warning 指令来消除这些警告

在之前代码上添加预处理指令:

复制代码 代码如下:

#pragma warning disable 0618,0219,0414
public class C
{

    int i = 10;//警告:C.i已赋值,但从未使用过它的值得

    [Obsolete("过期了",false)]
    public static void aa()
    {

    }


    static void Main()
    {
        int t=5; //警告:t已赋值,但其值从未使用
        aa(); //警告:过期了

    }
}


再次生成的时候发现警告消失了...

#pragma warning disable/restore 0618

其中disable/restore分别代表了禁用和开启警告,而后面的编号则代表了警告的编号,此处编写警告编号时无需以“CS”开头。

而这句代码只需书写在需要禁用或者开启的类文件中即可,这样此类对应的0618警告就不会出现了。

但是需要注意的是#pragma warning只对单个文件有作用,如果想禁用多个文件的警告可以使用编译器的/nowarn指令,具体可以见MSDN:点我进入

PS:#pragma 是一个单独的指令,而warning只是其中一个选项,#pragma的作用是:用于给编辑器提供特殊的指令,说明如何编译包含杂注的文件。

相关文章

  • 利用windows性能计数器进行服务器性能监控示例分享

    利用windows性能计数器进行服务器性能监控示例分享

    这篇文章主要介绍了利用windows性能计数器进行服务器性能监控的方法,大家可以参考扩展其它功能
    2014-01-01
  • c#发送请求访问外部接口的实例

    c#发送请求访问外部接口的实例

    这篇文章主要介绍了c#发送请求访问外部接口的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • C#通过Semaphore类控制线程队列的方法

    C#通过Semaphore类控制线程队列的方法

    这篇文章主要介绍了C#通过Semaphore类控制线程队列的方法,涉及Semaphore类操作线程队列的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C# 获取数据库中所有表名、列名的示例代码

    C# 获取数据库中所有表名、列名的示例代码

    这篇文章主要介绍了C# 获取数据库中所有表名、列名,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#从命令行读取参数的方法

    C#从命令行读取参数的方法

    这篇文章主要介绍了C#从命令行读取参数的方法,实例分析了C#命令行读取参数的实现技巧与操作流程,需要的朋友可以参考下
    2015-04-04
  • C# 实现WebSocket服务端教程

    C# 实现WebSocket服务端教程

    这篇文章主要介绍了C# 实现WebSocket服务端教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • .Net Winform开发笔记(四)透过现象看本质

    .Net Winform开发笔记(四)透过现象看本质

    本文将从Winform应用程序中的Program.cs文件的第一行代码开始逐步分析一个Winform应用程序到底是怎样从出生走向死亡
    2013-01-01
  • C# 提取PDF中的表格详情

    C# 提取PDF中的表格详情

    这篇文章主要给大家介绍C# 提取PDF中的表格,本文介绍在C#程序中(附VB.NET代码)提取PDF中的表格的方法,调用Spire.PDF for .NET提供的提取表格的 类 以及 方法 等来获取表格单元格中的文本内容,需要的朋友可以参考一下
    2021-10-10
  • C#(Winfrom)自定义控件--组合控件方式

    C#(Winfrom)自定义控件--组合控件方式

    文章介绍了创建和使用自定义控件的步骤:首先构建控件库项目,添加TextBox和Button控件并设置透明背景,编写属性及事件处理代码;然后通过测试程序验证功能,最后将控件部署到测试窗体中使用
    2025-07-07
  • C#实时监控文件系统变化的实战指南

    C#实时监控文件系统变化的实战指南

    在现代开发中,实时监控文件系统变化是许多应用场景的核心需求,例如日志分析、文件同步、配置热更新等,在C#中,FileSystemWatcher是实现类似功能的“卧底”工具,本文将揭秘如何通过FileSystemWatcher实现高效、隐蔽、稳定的文件系统监听,需要的朋友可以参考下
    2025-07-07

最新评论