c# Conditional用法详解

        百度了一下关于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不会有任何的体现,因为在编译器在编译的时候会根据是否有定义相应的宏定义来确定最终生成的代码:




  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值