C# 使用Conditional特性而不是#if条件编译
2016-05-15 17:13
351 查看
概述
#if/#endif 语句常用来基于同一份源码生成不同的编译结果,其中最常见的就是debug版和release版。但是这些工具在实际应用中并不是非常友好,因为它们容易被滥用,其代码页进而难以理解或调试。C#设计中考虑到这个问题,并提供了更好的工具——Conditional特性,用来为不同的环境编译不同的机器码。Conditional特性适用于方法的层面,这将强制我们将条件代码拆分为独立的方法。在需要编写条件代码时,我们应该使用Conditional特性来替代#if/#endif。
功能描述
看下面的代码:
任何使用了Conditional特性的方法都只能返回void类型。
功能扩展
我们可以配置解决方案文件,来决定编译时候运行的代码,流程如下:
1、配置解决方案信息:
2、编写代码约束:
代码生成的时候,我们就可以根据Conditional来决定编译走的流程;
#if/#endif 语句常用来基于同一份源码生成不同的编译结果,其中最常见的就是debug版和release版。但是这些工具在实际应用中并不是非常友好,因为它们容易被滥用,其代码页进而难以理解或调试。C#设计中考虑到这个问题,并提供了更好的工具——Conditional特性,用来为不同的环境编译不同的机器码。Conditional特性适用于方法的层面,这将强制我们将条件代码拆分为独立的方法。在需要编写条件代码时,我们应该使用Conditional特性来替代#if/#endif。
功能描述
使用#if/#endif 语句的缺点
例如编写一个私有方法来获取调用它的函数名称:private string CheckMethod() { #if DEBUG Trace.WriteLine("Entering CheckState for Person"); string methodName = new StackTrace().GetFrame(1).GetMethod().Name; return methodName; #endif return 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来决定编译走的流程;
相关文章推荐
- c#页面传参
- C#遍历DataSet中数据的方法总结
- C#控制RichTextBox滚动条的方法
- 【C#公共帮助类】WinRarHelper帮助类,实现文件或文件夹压缩和解压,实战干货
- leetcode 343: Integer Break(C#版)
- c# 如何获取项目的根目录
- leetcode 344: Reverse String (c#版)
- C#反射Assembly 详细说明
- C#中防止程序多次运行
- C#技术分享【Word转换成图片和PDF——2种方案】
- C# 非静态类和静态类
- C#读书雷达 | TW洞见
- C#调用百度地图API入门&解决BMap未定义问题
- c# XML和实体类之间相互转换(序列化和反序列化)
- C#开发 植物大战僵尸 修改阳光值 源码无私分享
- C#多线程开发,简单示例
- C#进程管理,简单示例
- C#多线程开发,简单示例-字符串并发处理
- C#异常处理机制
- C# 关于判断字符串为空的一些方法