zoukankan      html  css  js  c++  java
  • 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特性,更像是一个“语法糖”。

  • 相关阅读:
    Struts2获取参数的几种方式
    Struts2的Action中访问servletAPI方式
    struts2中常用配置
    struts2发送ajax的几个问题(不使用struts2-json-plugin的情况下)
    深入Struts2的过滤器FilterDispatcher--中文乱码及字符编码过滤器
    Ironic 裸金属实例的部署流程
    Ironic 裸金属管理服务的底层技术支撑
    Cinder AZ 与 Nova AZ 的同步问题
    OpenStack 对接 Ceph 环境可以创建卷但不能挂载卷的问题
    OpenStack 节点重启后无法联网的问题
  • 原文地址:https://www.cnblogs.com/wing011203/p/1638257.html
Copyright © 2011-2022 走看看