C# #define条件编译详解

2019-12-30 15:50:13刘景俊

本文导读:

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

#define Debug

说明:

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

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

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

4、Debug与DEBUG是不同的,C#区分大小写。

三、#define条件编译实例

方式一、使用#if


#define Dragon
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConditionalCompilation
{
  class Program
  {
    static void Main(string[] args)
    {
#if Dragon
      Console.WriteLine("Dragon is defined");
#else
      Console.WriteLine("Dragon is not defined");
#endif
      Console.ReadKey();
    }
  }
}

输出结果如下:

C#,#define,条件编译

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

C#,#define,条件编译

方式二、使用Conditional特性

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


#define Debug
#define Trace
#if (Debug && Trace)
#define DebugAndTrace
#endif
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConditionalCompilation
{
  class Program
  {
    static void Main(string[] args)
    {
      Print0();
      Print1();
      Print2();
      Print3();
      Console.ReadKey();
    }

    [Conditional("DEBUG")]
    static void Print0()
    {
      Console.WriteLine("DEBUG is defined");
    }

    [Conditional("Debug")]
    static void Print1()
    {
      Console.WriteLine("Debug is defined");
    }

    //定义了Debug或者Trace后才会执行此方法
    //或者的关系
    [Conditional("Debug"), Conditional("Trace")]
    static void Print2()
    {
      Console.WriteLine("Debug or Trace is defined");
    }

    //只有定义了Debug和Trace后才会执行此方法
    //并且的关系
    [Conditional("DebugAndTrace")]
    static void Print3()
    {
      Console.WriteLine("Debug and Trace is defined");
    }
  }
}