c#define类似_C#---#define条件编译
本⽂导读:
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、Debug与DEBUG是不同的,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 Program
11 {
12 static void Main(string[] args)
13 {
14 #if Dragon
15 Console.WriteLine("Dragon is defined");
16 #else
17 Console.WriteLine("Dragon is not defined");
18 #endif
19 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 ConditionalCompilation
13 {
14 class Program
15 {
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 {
define的基本用法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)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论