什么是c#预处理指令??

用于在 C# 源代码中嵌入的编译器命令。

C#预处理器指令有哪些??

↓↓↓这些就是预处理器指令啦

下面我们一一道来(●'◡'●)

1.#if ,#elif,#else,endif 

c#编译的第一步就是预处理,这一步中,根据源程序中#开头的指令(预处理指令)进行处理。
例如:
首先,预处理首先扫描到#define Debug1,预处理器得知你定义了Debug1
紧接着,预处理接着扫描到#if Debug1,因为已经定义了Debug1,所以这个条件成立,预处理器将
System.Console.WriteLine("我是Debug1(●'◡'●)")“抽取”,交给后续编译处理。
预处理器扫描到 #elif Debug2后 ,忽略了Console.WriteLine("Hello 我是 Debug2");.
扫描到#else 后,将忽略System.Console.WriteLine("啥都不是,所以输出我啦"); 这个语句,这两句都不交给编译器进行编译。
最终:
经过预处理后,只有System.Console.WriteLine("我是Debug1(●'◡'●)");语句被交给编译器处理生成代码;其他两句都没有交给编译器,被忽略了,因而不会生成代码。

备注:

结合使用 #if 与 #else#elif#endif#define  #undef 指令,可以根据一个或多个符号是否存在来包含或排除代码。在编译调试版本的代码或针对特定配置进行编译时,这会很有用。

以 #if 指令开始的条件指令必须用 #endif 指令显式终止。

2. #define ,# undef 指令

使用 #define 可以定义一个符号,并通过将该符号用作表达式传递给 #if指令,使该表达式的计算结果为 true

例如:

备注:

可以定义符号,但是无法对符号赋值。

#define 指令必须在使用任何也不是指令的指令之前出现在文件中。#define Debug1必须写在所有using 之前

可以用#undef来取消定义符号。

用 #define 创建的符号的范围是在其中定义该符号的文件。

#undef 使您可以取消符号的定义,以便通过将该符号用作#if指令中的表达式,使表达式的计算结果为 false

例如:

3.#warning 生成警告,#error生成错误

包含#warning指令后,编译器会主动发警告。

包含#error指令后,编译器会主动发生错误。

例如:

4.#pragma,#pragma warning

警告可以指出代码中可能存在的问题,所以是很有用滴。但是,有的警告我们可以合理地忽略,所以有必要关闭掉它们。

使用预处理指令#pragma 禁用 #warning指令

例如:#pragma warning disable 1030

使用预处理命令#pragma 还原警告

重新启用警告仍然是使用#pragma指令,只是在warning后面添加restore选项

例如:#pragma warning restore 1030

上述两条指令正好可以将一个特定的代码块包围起来,前提是已知警告不适用于这个代码块

例如:

5.#line(其实就是更改代码的行号而已)

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

(下面这段备注摘自:https://msdn.microsoft.com/zh-cn/library/34dk387t(v=vs.80).aspx)

备注:

#line 指令可能由生成过程中的自动中间步骤使用。例如,如果行从原始的源代码文件中移除,但是您仍希望编译器基于文件中的原始行号生成输出,则可以移除行,然后用 #line 模拟原始行号。

#line hidden 指令对调试器隐藏若干连续的行,这样当开发人员在逐句通过代码时,将会跳过 #line hidden 和下一个 #line 指令(假定它不是另一个 #line hidden 指令)之间的所有行。此选项也可用来使 ASP.NET 能够区分用户定义的代码和计算机生成的代码。尽管 ASP.NET 是此功能的主要使用者,但很可能将有更多的源生成器使用它。

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

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

源代码文件可以具有 #line 指令的任何编号。

6.#region ,#endregion

#region#endregion,就是把代码块折叠或者展开,#region后面加上说明的文字,当这组代码被折叠起来的时候,我们可以看到#region后面的说明文字

例如:

备注

 #region 块必须以 #endregion指令终止。

#region 块不能与 #if块重叠。但是,可以将 #region 块嵌套在 #if 块内,或将 #if 块嵌套在 #region 块内。

(下面这段摘自:https://msdn.microsoft.com/zh-cn/library/ms173226(v=vs.80).aspx)

7.#pragma checksum

可用于生成源文件的校验和,以帮助调试 ASP.NET 页。

#pragma checksum "filename" "{guid}" "checksum bytes"

参数

"filename"  

要求监视更改或更新的文件的名称。

"{guid}"  

文件的全局唯一标识符 (GUID)。

"checksum_bytes"  

十六进制数的字符串,表示校验和的字节。必须是偶数位的十六进制数。奇数位的数字会导致编译时警告,从而使指令被忽略。

Visual Studio 调试器使用校验和来确保找到的总是正确的源。编译器计算源文件的校验和,然后将输出发出到程序数据库 (PDB) 文件。最后,调试器使用 PDB 来比较它为源文件计算的校验和。

此解决方案不适用于 ASP.NET 项目,因为算出的是生成的源文件而不是 .aspx 文件的校验和。为解决此问题,#pragma checksum 为 ASP.NET 页提供了校验和支持。

在 Visual C# 中创建 ASP.NET 项目时,生成的源文件包含 .aspx 文件(从该文件生成源文件)的校验和。然后,编译器将此信息写入 PDB 文件。

如果编译器在该文件中没有遇到 #pragma checksum 指令,它将计算校验和,然后将算出的值写入 PDB 文件。

最后:

c#的预处理命令,它可以用来区分编译生成的文件。使用预处理器指令可以禁止编译器编译代码的某一部分,当您计划发布多个不同版本的代码的时候,就可以用到预处理器指令了。编译软件的不同版本时,使用预处理器指令还可以禁止编译器编译于额外功能相关的代码。另外,在编写提供调试信息的代码时,也可以使用预处理器指令哦。

C#预处理器指令 ,你造吗??? (●'◡'●)的更多相关文章

  1. C#预处理器指令

    在C#中有许多名为“预处理指令”的命令,这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面.例如,使用预处理器指令可以禁止编译器编译代码的某一部分.如果计划发布两个版本的代码,即基本 ...

  2. 一些C#预处理器指令

    像C语言一样,C#有一些预处理器指令的命令.例如,#if#end if,#define等,所谓这些命令是指不会转化为可执行代码中的一些命令,只是在编译的过程中起作用.下面简要介绍一下:1 .#defi ...

  3. C#中的预处理器指令详解

    这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregio ...

  4. C#中的预处理器指令

    C#中有许多名为“预处理器指令”的命令.这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面. 例如,使用预处理器指令可以禁止编译器编译代码的某一部分.如果计划发布两个版本的代码,即基 ...

  5. C#变量、常量、枚举、预处理器指令知多少

    一.变量 C#共有其中变量类型有:静态变量.实类变量.数组元素.数值参数.引用参数.输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { p ...

  6. [No0000FC]C# 预处理器指令

    预处理器指令指导编译器在实际编译开始之前对信息进行预处理. 所有的预处理器指令都是以 # 开始.且在一行上,只有空白字符可以出现在预处理器指令之前.预处理器指令不是语句,所以它们不以分号(;)结束. ...

  7. C#预处理器指令【转】

    本文转载自:http://www.cnblogs.com/miffylf/p/4005223.html C#有许多名为预处理器指令的命令.这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各 ...

  8. 雷林鹏分享:C# 预处理器指令

    C# 预处理器指令 预处理器指令指导编译器在实际编译开始之前对信息进行预处理. 所有的预处理器指令都是以 # 开始.且在一行上,只有空白字符可以出现在预处理器指令之前.预处理器指令不是语句,所以它们不 ...

  9. c#常用的预处理器指令

    预处理器指令指导编译器在实际编译开始之前对信息进行预处理.所有的预处理器指令都是以 # 开始. #define 预处理器指令创建符号常量.#define 允许您定义一个符号,这样,通过使用符号作为传递 ...

随机推荐

  1. onBlur事件与onfocus事件(js)

      onFocus事件就是当光标落在文本框中时发生的事件. onBlur事件是光标失去焦点时发生的事件. 可以编如下例子 1.html <HTML><HEAD><TITL ...

  2. 【OC简介-类和对象】

    OC与C语言相比,体现的是一种面向对象的思想.OC完全兼容C语言 OC中大多数类前面都有前缀NS,来源于乔布斯NextStep团队,被苹果收购后保留了所有基本语法,合并到Foundation中 OC语 ...

  3. DLL和LIB的一些知识点(网上搜集)

    关于lib和dll的区别如下:(1)lib是编译时用到的,dll是运行时用到的.如果要完成源代码的编译,只需要lib:如果要使动态链接的程序运行起来,只需要dll.(2)如果有dll文件,那么lib一 ...

  4. Mysql创建新用户后无法登录,提示 Access denied for user 'username'@'localhost' (using password: YES)

    MySQL创建新用户后无法登录,提示 Access denied for user 'username'@'localhost' (using password: YES) ,多半是因为存在匿名用户, ...

  5. iBatis简单介绍

    1.       Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate.Toplink等在java编程的对象持久化方面深受开发人员欢迎. 对象关系映 ...

  6. Java Spring AOP用法

    Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...

  7. HTML5按钮的点击态问题

    开始在网页上实现点击态是mousedown mouseup来实现但是手机HTML5实现点击态怎么就不可以了呢 经过查资料才知道手机浏览器来实现点击态是通过 touchstart touchend实现

  8. 一、ASP.NET MVC 路由(一)--- ASP.NET WebForm路由模拟

    ASP.NET WebForm 应用,用户请求的是物理文件,其中包括静态页面和动态页面,在Url中的显示都是服务器中一个物理文件的相对路径.但是ASP.NET MVC就不同了,用户请求的是Contro ...

  9. 创建动态WCF服务(无配置文件)

    public class WCFServer { ServiceHost host = null; public WCFServer(string addressurl, string tcpurl, ...

  10. 软件工程课设day3

    下载昨日新版本程序,完成修复项目的测试. 与组内成员讨论,确认项目新模块功能“吐槽墙”的设计方向与实现形式——因为项目为便捷工具类,社区形式的实现方式与项目本质背道而驰.因此决定以“点击目标课程条目, ...