条件编译

条件编译属于编译预处理的范畴,与c++不同,c#没有独立的预处理器。C#中的预处理指令仅仅用来与c保持一致,而不是编译器开始编译代码之前得一个单独的处理步骤,他是作为词法分析的一部分来执行的。

Msdn关于条件编译的说明:

可以使用条件编译选择特定的代码节进行编译,而排除其他代码节。例如,可能需要编写调试语句来比较同一编程任务的不同方法的速度,或者可能需要本地化用于多种语言的应用程序。条件编译语句被设计为在编译时(而不是在运行时)运行。

在VS2010中黓认已定义DEBUG & TRACE

条件编译指令

条件编译指令有以下四种:#if、#elif、#else、#endif

这些条件编译指令用来有条件的将部分程序段包括进来或排除在外。他们和c#中的if语句有类似的作用。

条件编译符号有两种可能的状态:已定义的或未定义的。在源文件词法处理开始时,条件编译符号除非已由外部机制(如命令行编译器选项)显式定义,否则是未定义的。

他们在程序中的出现的先后顺序必须是这样:

一条#if语句(必须有)

零或多条#elif语句

零或一条#else语句

一条#endif语句(必须有)

#define或#undef必须定义在所有using 命名空间前面.#define类型为布尔值的真,#undef为布尔值的假.

C#为此提出了一种更好的选择:Conditional特性。使用Conditional特性,我们可以将一些函数隔离出来,使得它们只有在定义了某些环境变量或者设置了某个值之后才能发挥作用。Conditional特性最常用的地方就是将代码改编为调试语句。.NET框架已经为此提供了相关的功能支持。

DEMO测试

Demo1:测试DEBUG,在不同编译模式下的结果

#define DEBUG //定义DEBUG
using System;
using System.Collections.Generic;
using System.Text;namespace Demo
{class Program{#if DEBUGstatic void PrintInfo(){System.Console.WriteLine("Debug Version");}#elsestatic void PrintInfo(){System.Console.WriteLine("Released Version");}#endifstatic void Main(string[] args){#if DEBUG   //以下代码被编译到Debug版本中System.Console.WriteLine("Debug版本");#else      //以下代码被编译到Release版本中System.Console.WriteLine("Released版本");#endifPrintInfo(); //根据条件编译符号确定输出是英语还是汉语//以下代码所有Debug与Release都有System.Console.ReadKey();}}
}

不论是在Debug / Release模式下得到的结果都如下:

结论:

定义了DEBUG后,无论使用Debug / Release 模式,始终 #if DEBUG为True.

这里有一点在测试的过程中发现的,在切换不同编译模式时,其实VS会自动将不执行的语句颜色变成灰色,如下图所示:

Demo2,接下我再测试一下去掉#define DEBUG,在Debug / Release模式下结果如何

//#define DEBUG //定义DEBUG
using System;
using System.Collections.Generic;
using System.Text;namespace Demo
{class Program{#if DEBUGstatic void PrintInfo(){System.Console.WriteLine("Debug Version");}#elsestatic void PrintInfo(){System.Console.WriteLine("Released Version");}#endifstatic void Main(string[] args){#if DEBUG   //以下代码被编译到Debug版本中System.Console.WriteLine("Debug版本");#else      //以下代码被编译到Release版本中System.Console.WriteLine("Released版本");#endifPrintInfo(); //根据条件编译符号确定输出是英语还是汉语//以下代码所有Debug与Release都有System.Console.ReadKey();}}
}

得到的结果分别如下:

Debug模式下

Released模式下

结论:

此时虽然我们在前都没有定义条件编译的指令,可#if DEBUG在Debug模式下自然为True,所以此时会得到的是"Released版本"的结果,而Release下为False,相反得到的是"Debug版本"结果.

同理在测试TRACE时結果和DEBUG一致,這里不明白的是DEBUG和TRACE的區別是什麼?

Demo3,测试自定义条件

#define English
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;namespace CSCompile
{class Program{
#if Englishstatic void PrintInfo(){System.Console.WriteLine("English Version");}
#elsestatic void PrintInfo(){System.Console.WriteLine("中文版");}
#endifstatic void Main(string[] args){PrintInfo(); //根据条件编译符号确定输出是英语还是汉语//以下代码所有Debug与Release都有System.Console.ReadKey();}}
}
结论:

不论是Debug模式 / Released模式下,当有定义"English"时都会得到"English Version",同样如果前面没有定义"English"时只都只会得到'中文版"结果.

Demo 4,Conditional测试

#define English
#define DEBUG
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;namespace CSCompile
{class Program{
#if Englishstatic void PrintInfo(){System.Console.WriteLine("English Version");}
#elsestatic void PrintInfo(){System.Console.WriteLine("中文版");}
#endif[Conditional("DEBUG")]static void Print(){System.Console.WriteLine("Conditional");}static void Main(string[] args){PrintInfo(); //根据条件编译符号确定输出是英语还是汉语Print();//以下代码所有Debug与Release都有System.Console.ReadKey();}}
}
结论:

和前面DEBUG测试一致,只是Conditional可以更方便的应用在函数上面.

其它说明

1.在引入System.Diagnostics命名空间后,我们可以对Debug / Trace 进行相应的代码编写,详见参考资料中第5点.

参考资料

1.c# 条件编译 #define #if #endif

2.C#中的预处理指令,你用了多少?

3.C#.NET学习笔记5---C#中的条件编译

4.c#条件编译

5.从Trace和Debug来看条件编译(Conditional Compilation)

转载于:https://www.cnblogs.com/athrunsoft/archive/2011/09/07/2169672.html

[笔记]读.Net 2.0面向对像揭密--条件编译相关推荐

  1. 怎样读一本书V5.0 ?(译)

    翻译找到俩篇,都在下边 怎样读一本书V5.0 ?(译) Feb 8 2017 原创 扫描二维码 一直想找到关于如何读书,并且是有效读书的解答,这本书中的观点和实践非常有借鉴意义,把它翻译出来,分享给大 ...

  2. EasyExcel 学习笔记 - 读Excel

    EasyExcel 学习笔记 - 读Excel pom.xml 添加依赖 测试数据 实体类 自定义转换器 最简单的读 写法1 写法2 写法3 写法4 多行头(跳过N行) 读多个sheet 读全部 sh ...

  3. 神马笔记 版本1.8.0——删除笔记/文件夹·技术细节篇

    神马笔记 版本1.8.0--删除笔记/文件夹·技术细节篇 一.目标 二.体验地址 三.技术问题 1. 拖拽排序问题 2. indexOf问题 四.Finally 一.目标 记录开发过程中的2个技术问题 ...

  4. 神马笔记 版本1.4.0

    神马笔记 版本1.4.0 一.新版本介绍 二.下载地址 三.下一版本功能预告 四.已经完成的功能 五.计划中的功能 六.意见反馈 1. 微信 2. 聊天宝 一.新版本介绍 新增undo/redo功能 ...

  5. 神马笔记 版本1.3.0

    神马笔记 版本1.3.0 一.新版本介绍 二.下载地址 三.已经完成的功能 四.下一版本功能预告 五.计划中的功能 六.意见反馈 1. 微信 2. 聊天宝 一.新版本介绍 新增文件夹收藏功能 添加文件 ...

  6. 读《如何有效阅读一本书:超实用笔记读书法》

    目录 书籍信息 为什么读这本书? 笔记与批注 前言 人与书关系的改变者 读书笔记改变读书方法 激发思想的火花 积极输出促进思想内化 在重读过程中有所收获 让读书体验更充实的19个技巧 书籍信息 如何有 ...

  7. 神马笔记 版本1.8.0——删除笔记/文件夹·代码篇

    神马笔记 版本1.8.0--删除笔记/文件夹·代码篇 一.目标 二.体验地址 三.功能设计 1. 实现删除功能 2. 处理最近删除的可见性 四.实现过程 1. 删除到最近删除 2. 从最近删除恢复 3 ...

  8. 神马笔记 版本1.7.0——辅助编辑·缘起篇

    神马笔记 版本1.7.0--辅助编辑·缘起篇 一.目标 二.体验地址 三.当前编辑文章的困境 1. 内容排序 2. 连续图片间的空白段落 3. 段落缩进 4. 大纲结构 四.辅助编辑还能更加强大 五. ...

  9. 神马笔记 版本2.2.0——功能优化

    神马笔记 版本2.2.0--功能优化 一.目标 二.体验地址 三.功能优化 四.功能介绍 1. 关于神马笔记 2. 搜索笔记忽略大小写 3. 文件夹内容界面 4. 图片列表显示图片尺寸 五.新版本规划 ...

  10. 《如何有效阅读一本书:超实用笔记读书法》读书笔记

    作者:[日]奥野宣之 文章目录 前言 第一章 用笔记管理读书生活 人与书关系的改变者 让笔记成为读书时的好伙伴 只要坚持就一定会有效 通过笔记养成良好的读书习惯 完善购书.读书和活用的方式 将读书过程 ...

最新文章

  1. 牛客小白月赛12 C 华华给月月出题 (积性函数,线性筛)
  2. scrapy的Middleware
  3. 处理局域网网速变慢问题的几个思路
  4. python打印长方形_利用python打印出菱形、三角形以及矩形的方法实例
  5. python爬silverlight_Python创建Silverlight控件编写过程经验分享
  6. linux7自动挂载怎么做,centos 7 实现自动按需挂载
  7. linux运维架构篇
  8. 【SpringBoot 】 组件管理 + 属性注入
  9. Ubuntu 16.04中zabbix4.2设置中文显示
  10. 语音识别技术在汽车上的应用
  11. 第E题 转换任意进制 (java方法直接解)==输入一个十进制数N,将它转换成R进制数输出
  12. CGAffineTransformMakeRotation 实现旋转
  13. HTML如何修改乱码,html网页乱码怎么修改
  14. mongodb基本数据类型
  15. JSP实战项目教程|基于JSP的学生请假系统开发视频教程
  16. 小技巧:办公邮箱怎么登录foxmail?outlook如何群发单显?
  17. java io 系列(转载skywang12345)
  18. mysql-cluster安装与配置
  19. 星界边境文本自动翻译机(高级版)使用说明
  20. 关于北京工作居住证相关问题

热门文章

  1. 编译并运行Java文件
  2. 优秀的基于VUE移动端UI框架合集
  3. 【转载】谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
  4. hdu 1800 字符串水题 可用字符串hash 字典树做 我用了最水的排序水过
  5. Json格式类的转换相关代码--转载
  6. Git提交空文件夹的技巧
  7. Android Stutio 3.0 - Gradle sync failed
  8. [uva11235]Frequent values(RMQ,ST,离散化)
  9. java多线程-慎重使用volatile关键字
  10. NSRunLoop NSTimer