全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

#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();
    }
  }
}

输出结果如下:

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

方式二、使用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");
    }
  }
}

输出结果如下:

说明:

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间接来完成,如示例代码中的组合操作

#if (Debug && Trace)
#define DebugAndTrace
#endif

使用Conditional属性的方法受到以下限制:

1、条件方法必须是类声明或结构声明中的方法。如果在接口声明中的方法上指定Conditional属性,将出现编译时错误;

2、条件方法不能是接口方法的实现。否则将发生编译时错误;

3、条件方法必须具有void返回类型;

4、不能用override修饰符标记条件方法。但是,可以用virtual修饰符标记条件方法。此类方法的重写方法隐含为有条件的方法,而且不能用Conditional属性显式标记。

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

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# C#  # #define  # 条件编译  # C# 编译生成dll文件供程序调用的两种方法  # C#实现将javascript文件编译成dll文件的方法  # 简单记录C# 条件编译  # C#命令行编译器配置方法  # C#中尾递归的使用、优化及编译器优化  # 手动编译C#代码的方法  # 多个  # 才会  # 可以用  # 右键  # 不能用  # 选项卡  # 就会  # 是因为  # 你可以  # 修饰符  # 做什么  # 我们可以  # 不容易  # 英文  # 此类  # 要比  # 重写  # 中去  # 转化为  # 你也可以 


相关文章: 如何获取PHP WAP自助建站系统源码?  建站主机如何选?高性价比方案全解析  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  高端建站如何打造兼具美学与转化的品牌官网?  如何快速搭建高效服务器建站系统?  制作网页的网站有哪些,电脑上怎么做网页?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  建站之星在线版空间:自助建站+智能模板一键生成方案  如何批量查询域名的建站时间记录?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  如何通过NAT技术实现内网高效建站?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  用v-html解决Vue.js渲染中html标签不被解析的问题  建站主机核心功能解析:服务器选择与网站搭建流程指南  深圳网站制作培训,深圳哪些招聘网站比较好?  建站之星安装路径如何正确选择及配置?  ,购物网站怎么盈利呢?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  如何配置FTP站点权限与安全设置?  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  建站主机选购指南与交易推荐:核心配置解析  广平建站公司哪家专业可靠?如何选择?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  网站设计制作公司地址,网站建设比较好的公司都有哪些?  如何快速搭建支持数据库操作的智能建站平台?  如何自定义建站之星网站的导航菜单样式?  h5网站制作工具有哪些,h5页面制作工具有哪些?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  建站之星价格显示格式升级,你的预算足够吗?  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何用PHP快速搭建CMS系统?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  公司门户网站制作流程,华为官网怎么做?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  代刷网站制作软件,别人代刷火车票靠谱吗?  建站VPS配置与SEO优化指南:关键词排名提升策略  MySQL查询结果复制到新表的方法(更新、插入)  如何通过远程VPS快速搭建个人网站?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  如何挑选高效建站主机与优质域名?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  宁波自助建站系统如何快速打造专业企业网站?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何设置并定期更换建站之星安全管理员密码?  如何在云主机上快速搭建网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。