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特性,更像是一个“语法糖”。

  • 相关阅读:
    《软件测试经验与教训》—读书笔记
    【转】性能测试工程师的素质
    【转】如何成为优秀的性能测试工程师
    性能测试学习之路
    FTP 、TCP/IP、HTTP、Cookies、Session
    Loadrunner工具介绍
    tesseract-ocr图像识别技术(一)
    MongoDB 自动分片 auto sharding
    mongodb 3.0下载安装、配置及mongodb最新特性、基本命令教程详细介绍
    java使用memcached2--集群部署
  • 原文地址:https://www.cnblogs.com/wing011203/p/1638257.html
Copyright © 2011-2022 走看看