zoukankan      html  css  js  c++  java
  • C# 条件编译

    有一部分代码只是用来调试使用,不期望在发布的时候执行。也有一些代码只是用来测试性能,也不期望在其他时候使用。在做源代码包的时候,我需要对不同的平台使用不同的代码。此时就可以用到条件编译符,在不同的条件下编译不同的代码

    和 C++ 差不多,在 C# 里面也有宏的概念,只是在 C# 里面的专业名词是条件编译符

    通过 #if #else 这些预处理器指令,可以指定使用不同的代码参加编译

    用法是在 #if 后面跟上条件判断逻辑,只要条件判断逻辑返回 true 那么在 #if 包含的范围内的代码将会参加编译

    #if 包含的范围内指的是在 #if 和下一个 #else#elif#endif 指令之间的范围,和普通的条件判断逻辑相同

    #if NET45
    
    // 添加代码
    // 如果定义了 NET45 这个宏,那么在这个范围内的代码将会参加编译
    
    #elif NET46
    
    // 如果没有定义 NET45 这个宏,那么将会进入这个分支的判断,如果定义了 NET46 这个宏那么在这个范围内的代码将会参加编译
    
    #else 
    
    // 在上面的判断都不成立的时候,在这个范围内的代码将会参加编译
    
    #endif
    

    上面是使用最长的判断代码,而更多的只是其中的组合,如 #if xx#endif 的代码

    例如我指定了在 DEBUG 模式,也就是调试模式下执行和发布模式不同的输出

    public void Foo()
    {
    #if DEBUG
        Console.WriteLine("Debug version");
    #endif
    }
    

    在有定义 DEBUG 宏的编译时候,也就是一般在调试的时候,将会编译下面代码

    public void Foo()
    {
        Console.WriteLine("Debug version");
    }
    

    而在没有定义 DEBUG 条件编译符的时候,将会编译下面的代码

    public void Foo()
    {
        
    }
    

    可以注意到 Console.WriteLine("Debug version"); 没有在没有定义 DEBUG 的时候参加编译,这段代码将被忽略

    这样就是预处理器指令命名的原因,表示在编译之前做的指令

    在进行判断是否进行编译的时候,支持使用复杂的条件判断,包括使用运算符 ==(相等)和 !=(不相等)判断逻辑,在使用运算符的左边是对应的宏,右边是 true 和 false 两个值,其中 true 表示存在这个宏的定义,如下代码

    #if DEBUG == true
    #endif
    

    上面代码的 #if DEBUG == true#if DEBUG 是等价写法

    另外还支持运算符 && (and) || (or) 和 ! (not) 连接多个判断

    此时的 #if DEBUG == false#if !DEBUG 是等价判断

    在使用连接符号的时候,支持添加 == 等判断运行符,也支持直接写条件编译符,如下代码

    #if NET45 || DEBUG == true
                // 在 NET45 定义或 DEBUG 定义的时候,这个范围内的代码可以执行
    #endif
    

    多个条件同时判断可以使用括号包含判断,请看代码

    #if NET46 || (DEBUG == true && NET47)
    #endif
    

    在定义了 NET46 或同时定义了 DEBUG 和 NET47 编译范围代码

    更多预定义宏请看dotnet 新项目格式与对应框架预定义的宏

    #if 预处理器指令

    我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

    如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

  • 相关阅读:
    httpmime-session 会话保持
    5.5 准备创建bean
    5.4 获取单例
    当有“Button1.Attributes.Add("onclick", "return confirm('你确定要保存修改吗?')");”时,验证控件失效的解决方法
    asp.net刷新本页面的六种方法总结
    return 、break和continue的区别和作用
    OnClientClick事件
    抽象接口
    C# 中的EventHandler实例详解-转
    GridView点击行触发SelectedIndexChanged事件
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086887.html
Copyright © 2011-2022 走看看