C# 使用Conditional特性而不是#if条件编译

      概述

    #if/#endif 语句常用来基于同一份源码生成不同的编译结果,其中最常见的就是debug版和release版。但是这些工具在实际应用中并不是非常友好,因为它们容易被滥用,其代码页进而难以理解或调试。C#设计中考虑到这个问题,并提供了更好的工具——Conditional特性,用来为不同的环境编译不同的机器码。Conditional特性适用于方法的层面,这将强制我们将条件代码拆分为独立的方法。在需要编写条件代码时,我们应该使用Conditional特性来替代#if/#endif。

      功能描述

使用#if/#endif 语句的缺点

  例如编写一个私有方法来获取调用它的函数名称:

private string CheckMethod(){#if DEBUGTrace.WriteLine("Entering CheckState for Person");string methodName = new StackTrace().GetFrame(1).GetMethod().Name;return methodName;
#endifreturn null;}

更好的解决办法——使用Conditional特性

  为了避免出现上面的问题我们可以使用Conditional特性。使用Conditional特性即可将一些函数拆分出来,让其只有在定义了某些环境变量或者设置了某个值之后才能编译并成为类的一部分。Conditional特性最常用的地方就是讲一段代码变成调试语句。使用Conditional特性的隔离策略要比#if/#endif不容易出错。

看下面的代码:

       [Conditional("DEBUG")]private void CheckMethod(){Trace.WriteLine("Entering CheckState for Person");string methodName = new StackTrace().GetFrame(1).GetMethod().Name;}

Conditional特性的限制

Conditional特性只可以应用在整个方法上。

任何使用了Conditional特性的方法都只能返回void类型。

      功能扩展

我们可以配置解决方案文件,来决定编译时候运行的代码,流程如下:

1、配置解决方案信息:

 

2、编写代码约束:

    [Conditional("IN_MEMORY")]private static void ConfigureInMemory(){................................................           }[Conditional("NHIBERNATE")]private static void ConfigureInMemory(){
      ................................................
     }

 

代码生成的时候,我们就可以根据Conditional来决定编译走的流程;

 

转载于:https://www.cnblogs.com/xibei666/p/5495561.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python安装opencv出现错误_Python3安装OpenCV出错,如何解决?

$ sudo pip install opencv-python $ sudo pip install opencv-contrib-python 参考下:python作业毕设:安装人工智能图像处理工具OpenCV​zhuanlan.zhihu.compython版本安装 适合所有平台: $ sudo pip install opencv-python $ sudo pip inst…

ioread32函数有关知识

x86体系和ARM体系的寻址方式是有差别的: 在x86下,为了能够满足CPU高速地运行,内存与CPU之间通过北桥相连并通过地址方式访问,而外设通过南桥与CPU相连并通过端口访问。 在ARM下也实现了类似的操作,通过两条不同的总线…

FPGA开发全攻略—— 调试

原文链接: FPGA开发全攻略连载之十三:FPGA实战开发技巧(12) 5.6 大规模设计的调试经验 在大规模设计的调试应该按照和设计理念相反的顺序,从底层测试,主要依靠ChipScope Pro 工具。下面主要介绍ChipScope P…

oracle创建表空间和用户授权

确定数据文件的存储地址,有两种情况,一个是明确存储地址,一个是跟其他表空间存在一个地方,但是不知道地址,这时候可以根据如下SQL进行查找:select t.* from sys.dba_data_files t where t.tablespace_name…

linux驱动 cdev,inode结构体

前面我们学习了字符设备结构体cdev Linux 字符设备驱动开发 (一)—— 字符设备驱动结构(上) 下面继续学习字符设备另外几个重要的 数据结构。 先看下面这张图,这是Linux 中虚拟文件系统、一般的设备文件与设备驱动程…

如何在VS和CB中配置MySQL环境

这里,由于我的MySQL安装在D盘 MY SQL\MySQL Server 5.6该路径下,所以后面的路径均以D:\MY SQL\MySQL Server 5.6开头 在VS中配置MySQL环境 包含目录: D:\MY SQL\MySQL Server 5.6\include 库目录:D:\MY SQL\MySQL Server 5.…

点乘和叉乘的区别_关于延时和混响的区别与专用延时器与混响器的调控技巧

关于延时和混响的区别与专用延时器与混响器的调控技巧延时器与混响器是模拟室内声场声音信号特性的专用设备。在录音节目制作中,延时器和混响器可以在模拟的艺术声场中传递时间、空间、方位、距离等重要信息,并且可以制作某些特殊效果。延时器与混响器工…

rs232读取智能电表_三相电表怎么看度数 怎么计算总电量

现在的三相电表一般都是在屏幕上面直接看,屏幕上面是有文字提示显示的,三相电表的总度数,上面的文字提醒一般是“正向有功总电量”,三相电表一般屏幕旁边都会上翻键和下翻键,可以上下翻开电表里面的数据。如下图所示&a…

android 学习随笔十六(广播 )

1、广播接收者 BroadcastReceiver接收系统发出的广播现实中的广播:电台为了传达一些消息,而发送的广播,通过广播携带要传达的消息,群众只要买一个收音机,就可以收到广播了 Android中的广播:系统在运行过程中…

Azure运维系列 4:安装和使用Azure PowerShell管理云

前面讲到了很多的管理方式,包括Azure中国最近更新的预览版管理门户和Azure云助理,都是非常不错的管理Azure的方式,今天我们再来介绍一种更加高效的管理方式Azure PowerShell。熟悉命令行的朋友都知道,Linux之所以那么好用是因为其…

python2编码_Python2字符编码

我们通常见到的字符串编码主要是三种GB2312/GBK、Unicode、UTF-8。GB2312/GBK是多字节(multibytes)编码的一种,属于“ASCII的加强版”,与之平行的由Big5、ShiftJIS之类的编码各自为政,所有这些用两个字节表示汉字的多字节编码标准统称为ANSI编…

angularJs关于指令的一些冷门属性

我们使用ng的时候,经常会使用到指令,大家所熟知的属性我在这里就不介绍了,讲讲大家没怎么留意的属性 1.multiElement 这是指定指令作用区间的功能,最常用的就是ng-repeat-start和ng-repeat-end了。 2.priority 指令优先级&#xf…

设备模型2

前言 在上一篇中,我们大致描述了LINUX设备模型,我们先来总结一下三要素的关系。 从图中可以看出,Linux设备模型就是"总线、设备、驱动、类"这四个概念之前的相互关系;这也是Linux2.6内核抽象出来的用于管理系统中所有设备的模型图; 简单地描述…

angular自定义指令详解

指令(directive)是angular里面最核心也是最难懂的东西,在慕课网看了下大漠穷秋老湿的视频,自己百度半天做了一些小test,总算把一切都搞明白了。 先列出学习来源: 指令中controller和link的区别:…

delphi7aes加密解密与java互转_跨语言(java vs python vs nodejs)的RSA加解密问题探讨

多次被问到这样的问题:java服务端的rsa加密操作已经完成,返回一个16进制的字符串给python平台,但是在python进行私钥解密的时候发现行不通。。。。前端python加密,后端用java解密,解不出来还有诸如nodejs从理论上来说&…

利用dft的定义计算dft的matlab程序_CP2K教程系列之静态计算(Pymatflow篇)

本系列CP2K教程是《CP2K菜根谭》的升级版,在旧版基础上添加了如何结合Pymatflow工具简化计算流程的内容。话不多说,本文将为您带来CP2K系列教程中的静态计算部分。静态计算设置静态计算是大多数人接触第一性原理计算后第一次运行的计算类型。很多其它类型…

微软是如何戏耍程序员们的

2019独角兽企业重金招聘Python工程师标准>>> 别用微软的东西。商业目的性太强,千万别被微软牵着鼻子走,血淋淋的教训。微软推出的垃圾多了去了。它什么都想做,很多都没做好: MFC:Win31时代出生,…

3d立体相册特效html网页代码_新闻类网页正文通用抽取器

项目起源开发这个项目,源自于我在知网发现了一篇关于自动化抽取新闻类网站正文的算法论文——《基于文本及符号密度的网页正文提取方法》这篇论文中描述的算法看起来简洁清晰,并且符合逻辑。但由于论文中只讲了算法原理,并没有具体的语言实现…

字节数组转换为图片_每日一课 | Python 3 TypeError:无法将“字节”对象隐式转换为str...

将Python 2套接字示例转换为Python 3whois.py import sysimport sockets socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.connect(("whois.arin.net", 43))s.send((sys.argv[1] "\r\n").encode())response ""while True: data s.re…

加速度计和陀螺仪数据融合

本帖翻译自 IMU(加速度计和陀螺仪设备)在嵌入式应用中使用的指南。这篇文章主要介绍加速度计和陀螺仪的数学模型和基本算法,以及如何融合这两者,侧重算法、思想的讨论介绍本指南旨在向兴趣者介绍惯性MEMS(微机电系统&a…