百度了一下关于conditional的文章,大都说的都是非常浅显,只是老生常谈了下尽量多使用conditional而少用#if,收获不大。

现在我自己测试了一下,也查阅了MSDN,有点心得,说出来与大家分享。

Conditional其实是一个属性类:ConditionalAttribute的简称。可应用于方法或者属性类。最常见的用法想必大家都知道:

[Conditional("CONDITIONA")]
        public static void Test()
        {
            Console.WriteLine("ConditionalTest.Func.Test!!!!");
        }
  用方法前置属性的方式来替换原有写法:
       public static void Test()
        {
#if CONDITIONA
            Console.WriteLine("ConditionalTest.Func.Test!!!!");
#endif
        }
  其实这边有个很大的陷阱:那就是上面两种的写法并不等价!用Conditional属性的方式,Test方法是否生效是取决于调用方,而用#if方式,Test方法是否生效是取决于方法定义所在的程序集。请看下图:

Fuc.Test()是定义在ConditionalTest程序集的一个Static方法,如果CSharpTest程序集中的代码想要成功的调用Test方法,那么应该在CSharpTest程序集中定义CONDITIONAL宏,否则永远无法调用成功,而Func.TestTwo()中的内容方法想要被成功执行,那么应该在ConditionalTest定义CONDITIONAL宏,跟其他程序集无关。宏定义的设置:右击工程->属性->生成->条件编译符号:

也就是说Conditional能够根据函数调用方的环境不同来选择是否执行,而#if是根据本程序集是否有配置相应宏定义来判断是否执行。

conditional还可以同时使用多个标识符,书写的方式有两种:

[Conditional("A"), Conditional("B")]
static void DoIfAorB()
{
    // ...
}
        或者:
[Conditional("A")]
        [Conditional("B")]
        static void DoIfAorB()
        {
            // ...
        }
  这些符号彼此之间存在逻辑的“或”关系,上面的两种写法,A或B的存在豆浆导致方法调用。
但是符号之间并不能进行“与”操作,如果要获得对符号进行“与”操作的效果,可以定义序列条件的方法:例如,仅当A和B都已定义时,才能执行下面的第二种方法:
[Conditional("A")]
static void DoIfA()
{
    DoIfAandB();
}
 
[Conditional("B")]
static void DoIfAandB()
{
    // Code to execute when both A and B are defined...
}
  除此之外,Conditional还可以被应用于属性类定义。代码如下:
[Conditional("DEBUG")]
public class Documentation : System.Attribute
{
    string text;
 
    public Documentation(string text)
    {
        this.text = text;
    }
}
 
class SampleClass
{
    // This attribute will only be included if DEBUG is defined.
    [Documentation("This method displays an integer.")]
    static void DoWork(int i)
    {
        System.Console.WriteLine(i.ToString());
    }
}
  在上例中,仅当定义了DEBUG时,自定义属性Documentation才向元数据添加信息。
        结论:并不能简单的说用Conditional来替代#if,因为两者的功能不尽相同,得根据情况具体分析。推荐使用Conditional的好处之一是让代码更加具有阅读性,但是本人认为如果并不是简单的#if,而是#if...#elif...#else...#endif这种逻辑性很强的代码的话,那么建议采用#if的写法,因为这样代码可读性反而更强。
  最后还有一点要说的是,作为dll引入的话,Conditional的用法会直接体现在类代码声明中,而#if不会有任何的体现,因为在编译器在编译的时候会根据是否有定义相应的宏定义来确定最终生成的代码:

————————————————
版权声明:本文为CSDN博主「BlueBones_fan」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fdyshlk/article/details/77603287

c# Conditional用法详解相关推荐

  1. Oracle Merge Into 的用法详解实例

    Oracle merge into 的用法详解实例 作用:merge into 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表: 语法: MERGE INTO [your table- ...

  2. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  3. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  4. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  5. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  6. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  7. php theme_path,PHP_Yii2主题(Theme)用法详解,本文实例讲述了Yii2主题(Theme) - phpStudy

    Yii2主题(Theme)用法详解 本文实例讲述了Yii2主题(Theme)用法.分享给大家供大家参考,具体如下: 首先看看主要的配置方式: 'components' => [ 'view' = ...

  8. LayoutInflater的inflate函数用法详解

    LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...

  9. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

  10. WinDbg用法详解

    WinDbg用法详解 对WinDbg的方方面面作了详细的讲解. 转载于:https://blog.51cto.com/laokaddk/125111

最新文章

  1. Python 技术篇-使用opencv库读取中文路径图片报错解决办法
  2. Spring Security OAuth2源码解析(一)
  3. leetcode 907. Sum of Subarray Minimums | 907. 子数组的最小值之和(单调栈)
  4. android p wifi一直在扫描_(一百六十八)Android P wifi 扫描失败结果上报流程梳理-扫描上报梳理②...
  5. 使用gson解决java对象循环引用问题
  6. 【初级02】java JVM核心技术(2)开发工具和GC策略
  7. win10下安装Cygwin配置gcc编译环境
  8. 测试一下flash显示图片
  9. Linux screen capture
  10. ascii码值为负数_C语言编程基础学习字符型数据的ASCII码值为何是负数?
  11. 天猫精灵通过私有云控制WiFi设备
  12. 微信小程序账号注册和APPID申请
  13. WSUS无法发现客户端
  14. TextView rotation 旋转
  15. PCB设计基础及技巧
  16. tween.js 用户指南 - 与 Three.js 配合使用的补间动画库
  17. 7-20 打印九九口诀表
  18. Netbeans 7.0 安装 Python 插件的方法
  19. Active: inactive (dead)
  20. ffmpeg 命令 监控屏幕,摄像头 udp推流 收流 。 包括低延迟处理

热门文章

  1. 【语音处理】基于matlab GUI汉宁窗FIR陷波滤波器语音信号加噪去噪【含Matlab源码 1711期】
  2. 【手势识别】基于matlab肤色静态手势识别【含Matlab源码 288期】
  3. 【单目标优化求解】基于matlab加权黑猩猩算法求解单目标问题【含Matlab源码 1412期】
  4. 【三维路径规划】基于matlab A_star算法无人机三维路径规划(起终点障碍物可设置)【含Matlab源码 1321期】
  5. 【C++】STL-函数对象(仿函数)
  6. 单元格排序_Excel中这8种简单实用的排序方法,很多人都还不会用!
  7. 自动刷新网页脚本_抢不到票?你离idol只差一个大麦抢票脚本。
  8. h5页面自定义字体_H5页面中常见的字体有哪些
  9. 互联网基础知识_互联网广告前景怎么样?
  10. mysql读写分离_SpringBoot+MyBatis+MySQL读写分离