2016-10-04 47 views
1

我可以在C#中使用#definepreprocessor directive里面的#if#endif吗?在C#中的#if中使用#define预处理器指令是否有效#

例如

#if !SILVERLIGHT && !__ANDROID__ && !__IOS__ 
#define SupportsMutex 
#endif 

它看起来像它的作品,但我需要确定。有很多关于这方面的文章,但大多数情况下,在C语言环境而不是C#环境下,C#中的预处理器指令更为有限。

Visual Studio的突出显示似乎支持它,但根据语言/编译器规范它真的有效吗?

This MSDN page给出了如下注释:

#define指令不能被用于声明如在C和C通常所做++恒定值。 C#中的常量最好定义为类或结构的静态成员。如果你有几个这样的常量,可以考虑创建一个单独的“常量”类来保存它们。

我需要这个,因为多次使用#if !SILVERLIGHT && !__ANDROID__ && !__IOS__很难管理。

当然,我们也可以将SupportsMutex添加到项目的“条件编译符号”中,但是这更难以管理且不太透明。

回答

5

是的。纵观C# specification这种用法的一个具体的例子在部分给出2.5.3声明指令,并视为有效:

#define Enterprise 
#if Professional || Enterprise 
    #define Advanced 
#endif 
namespace Megacorp.Data 
{ 
    #if Advanced  
    class PivotTable {...} 
    #endif 
} 
+0

谢谢!赶紧找到! – Julian