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

  • 相关阅读:
    IO 单个文件的多线程拷贝
    day30 进程 同步 异步 阻塞 非阻塞 并发 并行 创建进程 守护进程 僵尸进程与孤儿进程 互斥锁
    day31 进程间通讯,线程
    d29天 上传电影练习 UDP使用 ScketServer模块
    d28 scoket套接字 struct模块
    d27网络编程
    d24 反射,元类
    d23 多态,oop中常用的内置函数 类中常用内置函数
    d22 封装 property装饰器 接口 抽象类 鸭子类型
    d21天 继承
  • 原文地址:https://www.cnblogs.com/wing011203/p/1638257.html
Copyright © 2011-2022 走看看