#if/#endif语句常用来基于同一份源代码生成不同的编译结果,其中最常见的就是debug版和release版。但是这在实际应用中并不是非常友好,因为它们容易被滥用,其代码也难以理解或调试。
C#为此添加了一个Conditional特性,该特性可以标识出某种环境设置下某个方法是否应该被调用。使用这种方式来描述条件编译要比#if/#endif更加清晰。
下面来看几个例子:

private void CheckStateBad()
{#ifTrace.WriteLine("Entering CheckState for Person");string methodName = new StackTrace().GetFrame(1).GetMethod().Name;Debug.Assert(lastName != null, methodName, "Last Name can not be null");#endif
}

最终会在release版本留下一个CheckStateBad()的空方法,虽然在release版本中CheckStateBad()什么也不做,但是方法的加载、JIT编译和调用仍然有些开销。
而使用Conditional特性即可将一些函数拆分出来,让其只有在定义了某些环境变量或者某个值之后才能编译并成为类的一部分。

[Conditional("DEBUG")]
private void CheckStateBad()
{//code
}

无论是否定义了DEBUG环境变量,CheckStateBad()方法都将被编译至程序集中。这种做法看起来也似乎不那么高效,但是其中占用的仅仅是一点点磁盘空间而已。如果没有被调用,CheckStateBad()并不会加载到内存中,也不会被JIT编译。
在应用多个Conditional特性时,它们之间的组合关系将为"或"(OR)。

[Conditional("DEBUG"), Conditional("TRACE")]
private void CheckStateBad()
{//code
}

而若想创建一个使用"与"(AND)关系的构造,则需要自己在源代码中定义预处理符号:

#if (VAR1 && VAR2)
#define BOTH
#endif

然后可以按老式做法编写CheckStateBad()方法:

private void CheckStateBad()
{#if BOTH//code #endif
}

Conditional特性只可以应用在整个方法上。另外需要注意的是,任何一个使用Conditional特性的方法都只能返回void类型。

转载于:https://www.cnblogs.com/kw13202/p/6767297.html

《C#高效编程》读书笔记04-使用Conditional特性而不是#if条件编译相关推荐

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

    概述 #if/#endif 语句常用来基于同一份源码生成不同的编译结果,其中最常见的就是debug版和release版.但是这些工具在实际应用中并不是非常友好,因为它们容易被滥用,其代码页进而难以理解 ...

  2. 《计算之魂》读书笔记 04

    <计算之魂>读书笔记 04 1.4 关于排序的讨论 [1.4.3]针对特殊情况,我们是否还有更好的答案? [附录]为什么排序算法的复杂度不可能小于 O(nlogn)O(nlogn)O(nl ...

  3. 推荐系统实践读书笔记-04利用用户标签数据

    推荐系统实践读书笔记-04利用用户标签数据 推荐系统的目的是联系用户的兴趣和物品,这种联系需要依赖不同的媒介.GroupLens在一篇文章中表示目前流行的推荐系统基本上通过3种方式联系用户兴趣和物品. ...

  4. C++ Primer 读书笔记04

    C++ Primer 读书笔记04 关联容器 pair 动态内存 静态内存 栈内存 智能指针 shared_ptr 直接管理内存 new 空悬指针 智能指针陷阱 unique_ptr weak_ptr ...

  5. 《MATLAB 神经网络43个案例分析》:第43章 神经网络高效编程技巧——基于MATLAB R2012b新版本特性的探讨

    <MATLAB 神经网络43个案例分析>:第43章 神经网络高效编程技巧--基于MATLAB R2012b新版本特性的探讨 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 ...

  6. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  7. mozart-oz中有限域编程读书笔记

    mozart-oz自带文档: <Finite Domain Constraint Programming in Oz. A Tutorial.>读书笔记 http://www.mozart ...

  8. 这个好用高效的读书笔记app软件一定要收藏

    打开软件首页就是卡片式的读书笔记,可以上下左右滑动切换下一条笔记.首页笔记的推荐是系统根据你原来做的笔记或者看你点赞评论等行为智能推荐的.切换到下一条后就无法返回到上一条笔记. 点击底部中间的相机按钮 ...

  9. C专家编程-读书笔记(书本顺序)

    C语言设计哲学:   一切工作程序员自己负责.   语言中的所有特性都不需要隐式的运行时支持.   程序员所做的都是对的.   程序员应该知道自己在干什么,并保证自己的所作所为是正确的. ====== ...

  10. Python核心编程读书笔记

    转载自 http://blog.csdn.net/hunter8777/article/category/786856 本次笔记针对原书1~2章节 第一章:欢迎来到Python的世界 1.在C语言中, ...

最新文章

  1. 手机如何看python代码_python如何绘制iPhone手机图案?(代码示例)
  2. 有趣的HTML5/CSS3艺术网站
  3. 软件工程(2019)第四次作业-结队作业
  4. dmg文件转换iso ultraiso_mac去除dmg打开密码的方法
  5. 【EXLIBRIS】纸版书目整理 -- 大书架 上 【292 种】【327册】
  6. 你以为这样写代码很6,但我看不懂
  7. Python 调试 PDB
  8. 北海焊接机器人_东方自动焊接专机价格优惠
  9. Resnet论文解读与TensorFlow代码分析
  10. 【转】DD_belatedPNG,解决IE6不支持PNG绝佳方案
  11. 浏览器主页被hao123、360导航之类的流氓网址劫持解决方法
  12. C语言实现洗牌发牌程序,用C语言实现的扑克牌洗牌程序
  13. 微信h5页面图片预览
  14. Java 定义一个抽象类—水果,其中包括getWeight()方法,创建若干水果对象存放在一个水果类型的数组中,输出数组中所有水果的类型、重量。
  15. java程序框图 质数_判断质数的程序框图和算法
  16. 常用工程塑料特性总结
  17. python爬虫之股票数据定向爬取
  18. 遨博机器人AUBO C语言的SDK接口说明(1)
  19. c语言:抽签游戏实现
  20. 【FPGA教程案例34】通信案例4——基于FPGA的QPSK调制信号产生,通过matlab测试其星座图

热门文章

  1. 工作中的注意事项、细节
  2. linux远程升级运行程序,在LINUX上对DSP程序远程升级的实现想法
  3. Linux gcc编译时强制链接并依赖一个库(即使未使用)
  4. 全网首发:怎样制作CDKEY(2)-数据构造
  5. LINUX下载编译signalwire-c
  6. LINUX编译Android ffmpeg
  7. C++读取WINDOWS注册表
  8. 昨天发现,博客排名进行了两次
  9. 《TensorFlow深度学习应用实践》学习笔记1
  10. LINUX使用消息队列的代码