2010-09-27 398 views
2

在C/C++,你可以這樣做:在C#中編譯時間檢查條件編譯符號(請參閱示例)?

#define IN_USE  (1) 
#define NOT_IN_USE (-1) 

#define USING(system) (1/(system) == 1/IN_USE) 

然後:

#define MY_SYSTEM IN_USE 

#if USING(MY_SYSTEM) 
    <my_system impl> 
#endif 

這種類型的設置意味着:

  • 所有條件編譯符號必須定義IN_USE或NOT_IN_USE。

  • 我可以將它們全部放在一個頭文件(或一對)中,並輕鬆地打開/關閉它們,看看有什麼條件編譯符號。

  • 類似#if USING(MYSYSTEM)的錯字由編譯器捕獲,由於div爲0而不是靜靜地編譯出來。

是否有可能在C#中做到這一點?是否有另一種最佳實踐方式來實現相同的效果?

我知道在C#中,你可以通過在項目設置中設置它們,並使用#如果做條件編譯,但我不喜歡的事實,事情沒有被明確定義。這是您在項目設置中有「DEBUG」和「TRACE」複選框的原因。如果他們不在那裏,你不知道你可以打開它們。

回答

2

C#不允許給出預處理器符號,但您可以使用#define#ifdef/#endif。通常,預處理器符號實際上在項目屬性中而不是在代碼中定義在項目級別內。

如果相關的預處理器符號不存在,您可能還會對ConditionalAttribute感興趣,它允許調用以使用它裝飾的方法被省略。 (該方法本身仍然建立;它只是確定是否實際發生呼叫。)

如果您想要實際常數值,則可以使用conststatic readonly字段代替。

+0

它也看起來像他正在尋找C++宏類型的能力。儘管如此,我想不出一種實現解決方法的方法。 – Oded 2010-09-27 18:46:57

+0

是的,這是我一直在做的。但是,我想解決的主要問題是我錯誤地鍵入「#if DEBG」而不是「#if DEBUG」的情況。 很高興能看到所有可能的條件編譯符號的使用與否。 – 2010-09-27 18:49:10

0

C#沒有c預處理器。 它確實讓您擁有可以設置爲已定義或未定義的項目範圍或文件範圍的#define。您只能在#if /#else塊中使用它,並且您的測試僅限於存在/不存在。

所以你的情況,在VisualStudion您的項目設置,下建造,你就必須在條件編譯符號箱MY_SYSTEM。

一般來說,要圍繞因子類定義你的模塊,而不是圍繞預處理強辯,如果在所有可能的。

0

C#沒有一個預處理器,但是編譯器是足夠聰明,如果你給它一個常量作爲IF()條件,它會散發出/不恰當地發出代碼,使同樣的效果。

// in Conditionals.cs 
public static class Conditionals 
{ 
    public const bool MY_SYSTEM = true; 

} 

// In SomeOther.cs 
if (Conditionals.MY_SYSTEM) 
{ 
// <my_system impl>    
}