Effective C# Item4:使用Conditional特性代替#if条件编译

    条件编译的目的:希望同样的代码在不同的环境中生成不同的结果,最典型的情况就是在Debug模式和Release模式下,能够产生不同的编译结果。

    C#中,针对上述情况,有两种解决方案:1. 旧有的#if、#endif方式;2. 使用Conditional特性。

    #if方式存在的问题:

  1. 如果在代码中以“流水账”的方式添加#if,很容易造成代码可读性差,在发生错误后,很难进行调试。
  2. 如果有一段代码,你只希望在Debug模式下才会被调用,简单的方式就是将这段代码重构成方法,然后在方法的开始和结束处添加#if和#endif,这样做可以实现,但是效率很差,即使在Release模式下,也会调用这个方法,虽然这时的方法只是一个空方法。
  3. 如果代码中充满了#if和#endif,很容易造成同样的代码在不同模式下运行结果不一样,出现异常情况。

    使用Conditional特性,可以带来的好处:

  1. Conditional特性作用在方法级别上,这样最后生成的代码比较清晰,可读性强。
  2. Conditional特性作用的方法,如果当前环境变量中的值和Conditional特性中的值不一致时,Conditional特性作用的方法是不会被执行的,和#if方式相比,这种方式的性能会更好一些。

    使用Conditonal特性,需要注意:

  1. Conditional特性中可以为环境变量设置多个值,在执行时,这多个值之间,是OR的关系。
  2. 如果希望在条件编译时,同时满足环境变量中的多个值,才会执行某段逻辑,即条件编译使用的环境变量的值是多个,且多个值之间是AND的关系,那么只能使用#if的方式。
  3. Conditional特性作用的方法,其返回值只能是void类型,不能是其他类型。

    我认为这两种用于条件编译的方式,没有本质的区别。对于一个不成熟的程序员来说,即使使用Conditional特性,也不能完全解决#if带来的问题,例如代码可读性、代码的二义性,这个Conditional特性,更像是一个“语法糖”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值