首页 > 编程语言 >.NET/C# 使用 #if 和 Conditional 特性进行条件编译

.NET/C# 使用 #if 和 Conditional 特性进行条件编译

时间:2023-12-01 10:16:20浏览次数:28  
标签:符号 C# 代码 Conditional 编译 DEBUG NET

.NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景

发布于 2023-10-22 10:33:36 1690 举报

有小伙伴看到我有时写了 #if 有时写了 [Conditional] 问我两个不是一样的吗,何必多此一举。然而实际上两者的编译处理是不同的,因此也有不同的应用场景。

于是我写到这篇文章当中。


条件编译符号和预处理符号

我们有时会使用 #if DEBUG 或者 [Conditional("DEBUG")] 来让我们的代码仅在特定的条件下编译。

而这里的 DEBUG 是什么呢?

  • 在我们编写的 C# 代码中,这个叫做 “条件编译符号”(Conditional compilation symbols)
  • 在项目的构建过程中,这个叫做 “定义常量”(Define constants)
  • 而在将 C# 代码编译到 dll 的编译环节,这个叫做 “预处理符号”(Preprocessor symbols)

本文要讨论的是 #ifConditional 的使用,这是在 C# 代码中的使用场景,因此,本文后面都将其称之为 “条件编译符号”。

区别

#if

1 2 3 4 5

#if DEBUG Console.WriteLine("欢迎来 blog.walterlv.com 来做客呀!"); #endif

在这段代码中,#if DEBUG#endif 之间的代码仅在 DEBUG 下会编译,在其他配置下是不会编译的。

Conditional

1 2 3 4 5

[Conditional("DEBUG")] public void Foo() { Console.WriteLine("欢迎来 blog.walterlv.com 来做客呀!"); }

而这段代码,是会被编译到目标程序集中的。它影响的,是调用这个方法的代码。调用这个方法的代码,仅在 DEBUG 下会编译,在其他配置下是不会编译的。

场景

因为 #if DEBUG#endif 仅仅影响包含在其内的代码块,因此其仅仅影响写的这点代码所在的项目(或者说程序集)。于是使用 #if 只会影响实现代码。

[Conditional("DEBUG")] 影响的是调用它的代码,因此可以设计作为 API 使用——让目标项目(或者程序集)仅在目标项目特定的配置下才会编译。

 

标签:符号,C#,代码,Conditional,编译,DEBUG,NET
From: https://www.cnblogs.com/ioriwellings/p/17869081.html

相关文章

  • idea 查看 class文件 出现 /* compiled code */
    idea在初始化的时候会默认自带反编译插件,但是在有的同学初始化的时候没有勾选上插件,从而导致不能正常的反编译,class类提示 /*compiledcode*/。 解决方案:选择file->settings->plugins,在installed的插件中搜索JavaBytecodeDecompiler,勾选上后点击右下角的a......
  • macOS Sonoma 14.1.2 (23B92) 正式版 Boot ISO 原版可引导镜像下载 (Webkit 零日漏洞
    macOSSonoma14.1.2(23B92)正式版BootISO原版可引导镜像下载(Webkit零日漏洞修复)本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。请访问原文链......
  • css实现:不固定宽高,随内容宽度自动增长的圆形
    css代码:.circle{display:inline-block;border-radius:50%;min-width:20px;min-height:20px;padding:5px;background:red;color:white;text-align:center;line-height:1;box-sizing:co......
  • ESXi 主机的 CPU Ready值的范围
    ESXi主机的CPUReady值是指虚拟机在获取CPU资源之前等待的时间。CPUReady值越高,表示虚拟机在等待CPU资源的时间越长,性能越差。根据VMware官方的建议,ESXi主机的CPUReady值的正常范围如下:**0<%RDY<=5%:**此为正常区间,表示虚拟机的性能不会受到明显影响。**5%......
  • 实验四-现代C++标准库与类模板
    1#include<iostream>23usingstd::cout;4usingstd::endl;56classA{7public:8A(intx0,inty0):x{x0},y{y0}{}9voidshow()const{cout<<x<<","<<y<<endl;}10private:11......
  • 1、自定义上传组件实现动态指定action
    1、增加ynamicAction:String2、修改constuploadImgUrl=ref(props.dynamicAction||import.meta.env.VITE_APP_BASE_API+"/common/upload");//上传的图片服务器地址<el-uploadmultiple:action="uploadImgUrl"3、父组件<el-form-itemlab......
  • macOS Sonoma 14.1.2 (23B92 | 23B2091) 正式版发布,ISO、IPSW、PKG 下载 (Webkit 零日
    macOSSonoma14.1.2(23B92|23B2091)正式版发布,ISO、IPSW、PKG下载(Webkit零日漏洞修复)本站下载的macOS软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux中创建可引导介质。请访问......
  • Centos7 更新php7.1到7.4的方法
    因为WordPress要求最低php版本为7.4,故有此篇。系统版本:CentOS7.9第一步:查看已安装的php的所有包yumlistinstalled|grepphp第二步:卸载上述包yumremovephp*第三步:换下载源为remiyuminstallepel-releaserpm-ivhhttp://rpms.famillecollet.com/enterprise/re......
  • 子查询、Concat 字符拼接 ,Cast截取小数位 函数使用
    selectqh.CaseId,(selectsh.CaseIdfromServiceQuot.dbo.Headershwhereqh.QutoNo=sh.HeaderNo),qh.ApplierDate,qh.BU,qh.Site,qh.HeaderNo,qh.Currency(selectsh.CustomerfromServiceQuot.dbo.Headershwhereqh.QutoNo=sh.HeaderNo),qh.PN......
  • PageOfficeV6.0比较两个Word文件的内容差异
    转载:比较两个Word文件的内容差异比较两个Word文件的内容差异注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。调用PageOffice的WordCompare方法,同时在线打开两个Word文档,可以切换显示其中的一个文档,或者显示两......