2016-10-04 6 views
1

Могу ли я использовать #definepreprocessor directive внутри #if и #endif, на C#?Действительно ли используется директива препроцессора #define внутри #if в C#

например.

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

Похоже, что это работает, но я должен быть уверен. Об этом много написано, но большую часть времени в контексте C, а не C# - препроцессорные директивы a на 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