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…

PHP中面向对象的图片处理类

我们对图片的处理主要是添加水印和等比缩放&#xff0c;在PHP中&#xff0c;封装一个类来实现两个功能。源代码如下&#xff1a;<?php/***图片处理*/ class Image {//路径private $path ./upload/;//随机文件名private $isRandName;//初始化成员方法public function __con…

ioread32函数有关知识

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

几何分布的期望和方差公式推导_超几何分布的数学期望与方差推导

考虑 个外表相同的物品&#xff0c;其中有 个同类物品与另一类的 个物品&#xff1b;抽取 个物品&#xff0c;每个物品的抽取等概率随机。上述便是一个超几何分布&#xff08;Hypergeometric Distribution&#xff09;的基本模型。抽取 个 类物品的概率 在研究超几何分布的数学…

FPGA开发全攻略—— 调试

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

003很好的网络博客(TCP/IP)-很全

http://www.cnblogs.com/obama/p/3292335.html 很全的计算机网络方面的资料。

linux驱动文件操作简单介绍

1、设备号 主设备号标识设备对应的驱动程序&#xff0c;次设备号由内核使用&#xff0c;用于确定设备文件所指的设备。 通过次设备号获得一个指向内核设备的直接指针&#xff0c;也可将此设备号当作设备本地数组的索引。 设备编号用dev_t表示&#xff08;Linux/types.h 32位…

php学习笔记细节部分。

<?phpclass Car{public function Car()//构造函数 {//codeing 当实例化类的时候会调用这里面的方法}public function _destruct()//析构函数 {//codeing 对象的所有引用被删除&#xff0c;或者对象被显式的销毁时会执行的函数。 }} l转载于:https://www.cnblogs.com/OnlyL…

ctypes python_[python学习之路]ctypes,Python

ctypes 基本用法 ctypes 是一个方便 Python 调用本地已经编译好的外部库的模块。 from ctypes import util, CDLL 标准 C 库 使用 util 来找到标准 C 库&#xff1a; libc_name util.find_library(c) # on WINDOWS print libc_name msvcr90.dll 使用 CDLL 来加载 C 库&#xf…

oracle创建表空间和用户授权

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

linux驱动 cdev,inode结构体

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

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

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

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

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

zabbix监控工具

实验环境网关 classroom 172.25.8.254workstation 172.25.8.9server a-jeth0 172.25.8.10-外网eth1 192.168.0.x内网eth2 192.168.1.x备用servera:webservere:server--------------------------------------------需求&#xff1a;监控设计&#xff1a;原理&#xff1a;硬件&…

linux驱动 自旋锁

最近在内核频繁使用了自旋锁&#xff0c;自旋锁如果使用不当&#xff0c;极易引起死锁&#xff0c;在此总结一下。 自旋锁是一个互斥设备&#xff0c;它只有两个值&#xff1a;“锁定”和“解锁”。它通常实现为某个整数值中的某个位。希望获得某个特定锁得代码测试相关的位。…

百度输入法

[用户界面]&#xff1a;界面美观&#xff0c;有不同画风的ui界面&#xff0c;适合不同消费群体的需求。 [记住用户选择]&#xff1a;会默认记住用户以往的输入习惯&#xff0c;只需输入首拼音字母就会出现过去使用的高频词。 [短期刺激]&#xff1a;美化的用户界面让人眼前一新…

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

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

android 学习随笔十六(广播 )

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

驱动面试题总结

1、字符型驱动设备你是怎么创建设备文件的&#xff0c;就是/dev/下面的设备文件&#xff0c;供上层应用程序打开使用的文件&#xff1f; 答&#xff1a;mknod命令结合设备的主设备号和次设备号&#xff0c;可创建一个设备文件。 评&#xff1a;这只是其中一种方式&#xff0…

python程序写诗_将Python诗歌与D结合起来

在与docker一起使用poetry时&#xff0c;需要记住以下几点。 安装 安装poetry的正式方法是通过&#xff1a;curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python 这种方式允许poetry及其依赖项与依赖项分离。但是&#xff0c;在我看来…