《C#高效编程》读书笔记04-使用Conditional特性而不是#if条件编译
#if/#endif语句常用来基于同一份源代码生成不同的编译结果,其中最常见的就是debug版和release版。但是这在实际应用中并不是非常友好,因为它们容易被滥用,其代码也难以理解或调试。
C#为此添加了一个Conditional特性,该特性可以标识出某种环境设置下某个方法是否应该被调用。使用这种方式来描述条件编译要比#if/#endif更加清晰。
下面来看几个例子:
private void CheckStateBad()
{
#if
Trace.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类型。
《C#高效编程》读书笔记04-使用Conditional特性而不是#if条件编译的更多相关文章
- C# 使用Conditional特性而不是#if条件编译
概述 #if/#endif 语句常用来基于同一份源码生成不同的编译结果,其中最常见的就是debug版和release版.但是这些工具在实际应用中并不是非常友好,因为它们容易被滥用,其代码页进而难以理解 ...
- [转]C# 使用Conditional特性而不是#if条件编译
转自: http://www.cnblogs.com/xibei666/p/5495561.html 概述 #if/#endif 语句常用来基于同一份源码生成不同的编译结果,其中最常见的就是debug ...
- [读书笔记]Linux命令行与shell编程读书笔记04 安装软件,编辑器注意事项
1. debian以及redhat两种主流的linux发行版用的包管理工具 debian的包管理工具是 dpkg 再现安装的是 apt apt的工具主要有 apt-get apt-cache apti ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- 《深入了解java虚拟机》高效并发读书笔记——Java内存模型,线程,线程安全 与锁优化
<深入了解java虚拟机>高效并发读书笔记--Java内存模型,线程,线程安全 与锁优化 本文主要参考<深入了解java虚拟机>高效并发章节 关于锁升级,偏向锁,轻量级锁参考& ...
- Node.js高级编程读书笔记Outline
Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
- C++Windows核心编程读书笔记
转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...
- unix环境高级编程-读书笔记与习题解答-第一篇
从这周开始逐渐的进入学习状态,每天晚上都会坚持写c程序,并且伴随对这本书的深入,希望能写出更高质量的读书笔记和程序. 本书的第一章,介绍了一些关于unix的基础知识,在这里我不想去讨论linux到底是 ...
随机推荐
- 【255】◀▶IEW-Unit20
Unit 20 Environment: Tourism I.定语从句及分词在雅思写作中的运用 定语从句: 1. 先行词 2. 关系词:关系代词.关系副词 3. 非限制性定语从句 4. 分词和定语从句 ...
- [51nod1247]可能的路径(思维题)
题意:给定(a,b),(x,y) ,(a,b)可以通向(a-b,b) (a+b,b) (a,a+b) (a,a-b) 求能否到达(x,y) 解题关键:类似于更相减损,变换过程中gcd是一样的. #i ...
- Add lombok to IntelliJ IDEA
Lombok study link: https://www.jianshu.com/p/365ea41b3573 Add below dependency code to pom.xml <d ...
- php学习笔记-变量的作用域
这个东西很难理解,但很重要,我觉得非常容易出错. PHP中的变量按照作用域分为有两种,一种是global,一种是local. 函数内部声明的变量就叫local型变量,只能在函数内部被访问到.一句话,l ...
- 36、EST-SSR标记开发
转载:http://fhqdddddd.blog.163.com/blog/static/1869915420124131096557/ MISA工具提供批量识别和定位简单重复序列(SSR),EST序 ...
- Entity Framework Code-First(11):Configure One-to-One
Configure One-to-Zero-or-One Relationship: Here, we will configure One-to-Zero-or-One relationship b ...
- html span
提示:请使用 <span> 来组合行内元素,以便通过样式来格式化它们.注释:span 没有固定的格式表现.当对它应用样式时,它才会产生视觉上的变化.以上是w3上的标准解释,另外span是个 ...
- Codeforces#514E(贪心,并查集)
#include<bits/stdc++.h>using namespace std;long long w[100007],sum[100007];int fa[100007],degr ...
- 排序工作量之新任务(SHOI2001)
排序工作量之新任务(SHOI2001) 给出两个整数n和t,求n的全排列中逆序对数为t的个数,和逆序对数为t的字典序最小全排列. 首先第一个问题可以用dp解决,\(f[i][j]\)表示前i个数,j个 ...
- JavaWeb:Servlet技术
JavaWeb:Servlet技术 快速开始 Servlet是什么 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 ...