条件编译的目的:希望同样的代码在不同的环境中生成不同的结果,最典型的情况就是在Debug模式和Release模式下,能够产生不同的编译结果。
C#中,针对上述情况,有两种解决方案:1. 旧有的#if、#endif方式;2. 使用Conditional特性。
#if方式存在的问题:
- 如果在代码中以“流水账”的方式添加#if,很容易造成代码可读性差,在发生错误后,很难进行调试。
- 如果有一段代码,你只希望在Debug模式下才会被调用,简单的方式就是将这段代码重构成方法,然后在方法的开始和结束处添加#if和#endif,这样做可以实现,但是效率很差,即使在Release模式下,也会调用这个方法,虽然这时的方法只是一个空方法。
- 如果代码中充满了#if和#endif,很容易造成同样的代码在不同模式下运行结果不一样,出现异常情况。
使用Conditional特性,可以带来的好处:
- Conditional特性作用在方法级别上,这样最后生成的代码比较清晰,可读性强。
- Conditional特性作用的方法,如果当前环境变量中的值和Conditional特性中的值不一致时,Conditional特性作用的方法是不会被执行的,和#if方式相比,这种方式的性能会更好一些。
使用Conditonal特性,需要注意:
- Conditional特性中可以为环境变量设置多个值,在执行时,这多个值之间,是OR的关系。
- 如果希望在条件编译时,同时满足环境变量中的多个值,才会执行某段逻辑,即条件编译使用的环境变量的值是多个,且多个值之间是AND的关系,那么只能使用#if的方式。
- Conditional特性作用的方法,其返回值只能是void类型,不能是其他类型。
我认为这两种用于条件编译的方式,没有本质的区别。对于一个不成熟的程序员来说,即使使用Conditional特性,也不能完全解决#if带来的问题,例如代码可读性、代码的二义性,这个Conditional特性,更像是一个“语法糖”。