C# 使用Conditional特性而不是#if条件编译
概述
#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来决定编译走的流程;