百度了一下关于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