C#预处理器指令 ,你造吗??? (●'◡'●)
什么是c#预处理指令??
用于在 C# 源代码中嵌入的编译器命令。
C#预处理器指令有哪些??
↓↓↓这些就是预处理器指令啦

下面我们一一道来(●'◡'●)
1.#if ,#elif,#else,endif

首先,预处理首先扫描到#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 块不能与 #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"
十六进制数的字符串,表示校验和的字节。必须是偶数位的十六进制数。奇数位的数字会导致编译时警告,从而使指令被忽略。
此解决方案不适用于 ASP.NET 项目,因为算出的是生成的源文件而不是 .aspx 文件的校验和。为解决此问题,#pragma checksum 为 ASP.NET 页提供了校验和支持。
在 Visual C# 中创建 ASP.NET 项目时,生成的源文件包含 .aspx 文件(从该文件生成源文件)的校验和。然后,编译器将此信息写入 PDB 文件。
如果编译器在该文件中没有遇到 #pragma checksum 指令,它将计算校验和,然后将算出的值写入 PDB 文件。
最后:
c#的预处理命令,它可以用来区分编译生成的文件。使用预处理器指令可以禁止编译器编译代码的某一部分,当您计划发布多个不同版本的代码的时候,就可以用到预处理器指令了。编译软件的不同版本时,使用预处理器指令还可以禁止编译器编译于额外功能相关的代码。另外,在编写提供调试信息的代码时,也可以使用预处理器指令哦。
C#预处理器指令 ,你造吗??? (●'◡'●)的更多相关文章
- C#预处理器指令
在C#中有许多名为“预处理指令”的命令,这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面.例如,使用预处理器指令可以禁止编译器编译代码的某一部分.如果计划发布两个版本的代码,即基本 ...
- 一些C#预处理器指令
像C语言一样,C#有一些预处理器指令的命令.例如,#if#end if,#define等,所谓这些命令是指不会转化为可执行代码中的一些命令,只是在编译的过程中起作用.下面简要介绍一下:1 .#defi ...
- C#中的预处理器指令详解
这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregio ...
- C#中的预处理器指令
C#中有许多名为“预处理器指令”的命令.这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面. 例如,使用预处理器指令可以禁止编译器编译代码的某一部分.如果计划发布两个版本的代码,即基 ...
- C#变量、常量、枚举、预处理器指令知多少
一.变量 C#共有其中变量类型有:静态变量.实类变量.数组元素.数值参数.引用参数.输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { p ...
- [No0000FC]C# 预处理器指令
预处理器指令指导编译器在实际编译开始之前对信息进行预处理. 所有的预处理器指令都是以 # 开始.且在一行上,只有空白字符可以出现在预处理器指令之前.预处理器指令不是语句,所以它们不以分号(;)结束. ...
- C#预处理器指令【转】
本文转载自:http://www.cnblogs.com/miffylf/p/4005223.html C#有许多名为预处理器指令的命令.这些命令从来不会转化为可执行代码中的命令,但会影响编译过程的各 ...
- 雷林鹏分享:C# 预处理器指令
C# 预处理器指令 预处理器指令指导编译器在实际编译开始之前对信息进行预处理. 所有的预处理器指令都是以 # 开始.且在一行上,只有空白字符可以出现在预处理器指令之前.预处理器指令不是语句,所以它们不 ...
- c#常用的预处理器指令
预处理器指令指导编译器在实际编译开始之前对信息进行预处理.所有的预处理器指令都是以 # 开始. #define 预处理器指令创建符号常量.#define 允许您定义一个符号,这样,通过使用符号作为传递 ...
随机推荐
- tar.xz文件解压
原文:http://blog.csdn.net/rheostat/article/details/7614451 感谢CSDN的<帝都码农> ======================= ...
- java-注解
概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据与程序元素(类.方法.成员变量等)进行关联.更通俗的意思是为程序 ...
- 解决 504 Gateway Time-out和502 Bad Gateway(nginx)
504 Gateway Time-out 问题所在: 所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓 ...
- RESTful接口设计原则/最佳实践(学习笔记)
RESTful接口设计原则/最佳实践(学习笔记) 原文地址:http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api 1 ...
- iOS Wi-Fi
查漏补缺集是自己曾经做过相关的功能,但是重做相关功能或者重新看到相关功能的实现,感觉理解上更深刻.这一类的文章集中记录在查漏补缺集. iOS 开发中难免会遇到很多与网络方面的判断,这里做个汇总,大多可 ...
- HttpCookie加匿名类实现多语言
突然想做一个多语言网站,确不知道怎么实现好,突然想到了HttpCookie,然后页面后台用匿名类实现语言的储存. string lan = Request["str_lan"]; ...
- 2016,Raym
Hello,2016: 这是承上启下的一年! Raym
- [Asp.net 开发系列之SignalR篇]专题六:使用SignalR实现消息提醒
一.引言 前面一篇文章我介绍了如何使用SignalR实现图片的传输,然后对于即时通讯应用来说,消息提醒是必不可少的.现在很多网站的都有新消息的提醒功能.自然对于SignalR系列也少不了这个功能的实现 ...
- 【腾讯Bugly干货分享】微信Tinker的一切都在这里,包括源码(一)
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ecdf2d98250b4631ae034b 最近半年以来,Android热补 ...
- [专业名词·硬件] 2、DC\DC、LDO电源稳压基本常识(包含基本原理、高效率模块设计、常见问题、基于nRF51822电源管理模块分析等)·长文
综述先看这里 第一节的1.1简单介绍了DC/DC是什么: 第二节是关于DC/DC的常见的疑问答疑,非常实用: 第三节是针对nRF51822这款芯片电源管理部分的DC/DC.LDO.1.8的详细分析,对 ...