博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#---#define条件编译
阅读量:5142 次
发布时间:2019-06-13

本文共 3198 字,大约阅读时间需要 10 分钟。

 

本文导读:

C#的预处理器指令从来不会转化为可执行代码的命令,但是会影响编译过程的各个方面,常用的预处理器指令有#define、#undef、#if,#elif,#else和#endif等等,下面介绍C#中使用#define进行条件编译的实例。

C#中条件编译指令用于按条件包含或排除源文件中的某些部分。在Visual Studio中,会看到被排除的代码显示为灰色。

一、#define可以用来做什么

1、当计划发布两个版本的代码的时候。即基本版和拥有更多版本的企业版,就可以用到条件编译指令;

2、例如同一个文件给silverlight、wpf、winform等使用,并且还考虑Debug和Release等,有大部分代码是一样的;

3、指定函数和属性是否编译到最终产品中去。

二、#define用法

语法:#define 名称

注意:这里名称取Debug,你也可以取其他名称如Dragon

1 #define Debug

说明:

1、Debug可以看做是声明的一个变量,但此变量没有真正的值,存在时#if Debug结果为true,否则为false;

2、#define单独用没什么意义,一般是和#if或者Conditional特性结合使用;

3、#define必须定义在所有using命名空间前面;

4、DebugDEBUG是不同的,C#区分大小写。

三、#define条件编译实例

方式一、使用#if

复制代码
1 #define Dragon 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Diagnostics; 7  8 namespace ConditionalCompilation 9 {10     class Program11     {12         static void Main(string[] args)13         {14 #if Dragon15             Console.WriteLine("Dragon is defined");16 #else17             Console.WriteLine("Dragon is not defined");18 #endif19             Console.ReadKey();20         }21     }22 }
复制代码

输出结果如下:

如果注释掉 //#define Dragon ,输出结果为:

方式二、使用Conditional特性

我们可以将一些函数隔离出来,使得它们只有在定义了某些环境变量或者设置了某个值之后才能发挥作用,使用Conditional特性的隔离策略要比#if/#endif不容易出错。

复制代码
1 #define Debug 2 #define Trace 3 #if (Debug && Trace) 4 #define DebugAndTrace 5 #endif 6 using System; 7 using System.Collections.Generic; 8 using System.Linq; 9 using System.Text;10 using System.Diagnostics;11 12 namespace ConditionalCompilation13 {14     class Program15     {16         static void Main(string[] args)17         {18             Print0();19             Print1();20             Print2();21             Print3();22             Console.ReadKey();23         }24 25         [Conditional("DEBUG")]26         static void Print0()27         {28             Console.WriteLine("DEBUG is defined");29         }30 31         [Conditional("Debug")]32         static void Print1()33         {34             Console.WriteLine("Debug is defined");35         }36 37         //定义了Debug或者Trace后才会执行此方法38         //或者的关系39         [Conditional("Debug"), Conditional("Trace")]40         static void Print2()41         {42             Console.WriteLine("Debug or Trace is defined");43         }44 45         //只有定义了Debug和Trace后才会执行此方法46         //并且的关系47         [Conditional("DebugAndTrace")]48         static void Print3()49         {50             Console.WriteLine("Debug and Trace is defined");51         }52     }53 }
复制代码

输出结果如下:

说明:

1、代码中没有定义DEBUG,却输出了DEBUG,是因为DEBUG版本,自动定义了DEBUG。“项目——右键——属性——生成选项卡——常规栏”下的定义 DEBUG 常量(U)前面的复选框被选中。当然你可以去掉其选中状态,这样就不会输出DEBUG了。

2、如果Debug和Trace均没有定义,则不会输出Debug or Trace;只有Debug和Trace均定义了,才会输出Debug and Trace。

3、可以给Conditional增加多个属性如示例代码 [Conditional("Debug"), Conditional("Trace")] ,不过多个属性之间的关系是或的关系,即“Debug”或者“Trace”任意一个被定义了,那么对应方法就会被执行。

4、如果需要增加多个与的属性,直接用Conditional是无法实现的,需要借助#if/#endif间接来完成,如示例代码中的组合操作

环境变量(或条件编译符号)的设置方法有三:

1)用#define定义以及#undef取消定义,在所有using命名空间前面定义;

2)用编译器命令行选项(例如,/define:DEBUG),在“项目——右键——属性——生成选项卡——常规栏”下的条件编译符号(Y)中设置(如果多个,可以用英文逗号隔开)。DEBUG版本下,系统默认设置了DEBUG和TRACE;

3)用操作系统外壳程序中的环境变量(例如,set DEBUG=1)。

http://www.cnblogs.com/Scl891004X/p/6147787.html#undefined

参考链接①:

参考链接②:

参考链接③:

转载于:https://www.cnblogs.com/woxihuadabai/p/8005892.html

你可能感兴趣的文章
因为没有打开的文档,所以这一命令无效==操作word问题
查看>>
C++获取Windows7 32位系统中所有进程名(类似于任务管理器中的进程)
查看>>
团队作业8----第二次项目冲刺(Beta阶段) 第三天
查看>>
用mrpt库时遇到的一个坑
查看>>
【19】235. Lowest Common Ancestor of a Binary Search Tree
查看>>
关闭vs的编译警告
查看>>
opencv载入,显示及保存图像
查看>>
C++回调机制实现(转)
查看>>
iOS基础篇 - UIWindow的简单介绍
查看>>
处理重复导入的方法之一
查看>>
五十六. playbook基础 、 playbook进阶
查看>>
PICT测试工具的安装及使用
查看>>
ORA-28000: the account is locked-的解决办法
查看>>
只有ReflectionOnlyLoadFrom才可以拯救与GAC冲突的强命名程序集
查看>>
Day44:MySQL(单表的表记录的操作)
查看>>
家用路由器端口映射实战
查看>>
C++: class sizeof
查看>>
WCF契约定义及主要用途
查看>>
issubclass/type/isinstance、方法和函数、反射
查看>>
ORA-12523: TNS: 监听程序无法找到适用于客户机连接的例程
查看>>