本文導讀:html
C#的預處理器指令歷來不會轉化爲可執行代碼的命令,可是會影響編譯過程的各個方面,經常使用的預處理器指令有#define、#undef、#if,#elif,#else和#endif等等,下面介紹C#中使用#define進行條件編譯的實例。函數
C#中條件編譯指令用於按條件包含或排除源文件中的某些部分。在Visual Studio中,會看到被排除的代碼顯示爲灰色。post
1、#define能夠用來作什麼spa
一、當計劃發佈兩個版本的代碼的時候。即基本版和擁有更多版本的企業版,就能夠用到條件編譯指令;操作系統
二、例如同一個文件給silverlight、wpf、winform等使用,而且還考慮Debug和Release等,有大部分代碼是同樣的;.net
三、指定函數和屬性是否編譯到最終產品中去。命令行
2、#define用法3d
語法:#define 名稱code
注意:這裏名稱取Debug,你也能夠取其餘名稱如Dragonorm
1 #define Debug
說明:
一、Debug能夠看作是聲明的一個變量,但此變量沒有真正的值,存在時#if Debug結果爲true,不然爲false;
二、#define單獨用沒什麼意義,通常是和#if或者Conditional特性結合使用;
三、#define必須定義在全部using命名空間前面;
四、Debug與DEBUG是不一樣的,C#區分大小寫。
3、#define條件編譯實例
方式1、使用#if
1 #define Dragon 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Diagnostics; 7 8 namespace ConditionalCompilation 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 #if Dragon 15 Console.WriteLine("Dragon is defined"); 16 #else 17 Console.WriteLine("Dragon is not defined"); 18 #endif 19 Console.ReadKey(); 20 } 21 } 22 }
輸出結果以下:
若是註釋掉 //#define Dragon ,輸出結果爲:
方式2、使用Conditional特性
咱們能夠將一些函數隔離出來,使得它們只有在定義了某些環境變量或者設置了某個值以後才能發揮做用,使用Conditional特性的隔離策略要比#if/#endif不容易出錯。
1 #define Debug 2 #define Trace 3 #if (Debug && Trace) 4 #define DebugAndTrace 5 #endif 6 using System; 7 using System.Collections.Generic; 8 using System.Linq; 9 using System.Text; 10 using System.Diagnostics; 11 12 namespace ConditionalCompilation 13 { 14 class Program 15 { 16 static void Main(string[] args) 17 { 18 Print0(); 19 Print1(); 20 Print2(); 21 Print3(); 22 Console.ReadKey(); 23 } 24 25 [Conditional("DEBUG")] 26 static void Print0() 27 { 28 Console.WriteLine("DEBUG is defined"); 29 } 30 31 [Conditional("Debug")] 32 static void Print1() 33 { 34 Console.WriteLine("Debug is defined"); 35 } 36 37 //定義了Debug或者Trace後纔會執行此方法 38 //或者的關係 39 [Conditional("Debug"), Conditional("Trace")] 40 static void Print2() 41 { 42 Console.WriteLine("Debug or Trace is defined"); 43 } 44 45 //只有定義了Debug和Trace後纔會執行此方法 46 //而且的關係 47 [Conditional("DebugAndTrace")] 48 static void Print3() 49 { 50 Console.WriteLine("Debug and Trace is defined"); 51 } 52 } 53 }
輸出結果以下:
說明:
一、代碼中沒有定義DEBUG,卻輸出了DEBUG,是由於DEBUG版本,自動定義了DEBUG。「項目——右鍵——屬性——生成選項卡——常規欄」下的定義 DEBUG 常量(U)前面的複選框被選中。固然你能夠去掉其選中狀態,這樣就不會輸出DEBUG了。
二、若是Debug和Trace均沒有定義,則不會輸出Debug or Trace;只有Debug和Trace均定義了,纔會輸出Debug and Trace。
三、能夠給Conditional增長多個屬性如示例代碼 [Conditional("Debug"), Conditional("Trace")] ,不過多個屬性之間的關係是或的關係,即「Debug」或者「Trace」任意一個被定義了,那麼對應方法就會被執行。
四、若是須要增長多個與的屬性,直接用Conditional是沒法實現的,須要藉助#if/#endif間接來完成,如示例代碼中的組合操做
環境變量(或條件編譯符號)的設置方法有三:
1)用#define定義以及#undef取消定義,在全部using命名空間前面定義;
2)用編譯器命令行選項(例如,/define:DEBUG),在「項目——右鍵——屬性——生成選項卡——常規欄」下的條件編譯符號(Y)中設置(若是多個,能夠用英文逗號隔開)。DEBUG版本下,系統默認設置了DEBUG和TRACE;
3)用操做系統外殼程序中的環境變量(例如,set DEBUG=1)。
http://www.cnblogs.com/Scl891004X/p/6147787.html#undefined
參考連接①:http://www.studyofnet.com/news/1240.html
參考連接②:http://blog.csdn.net/teng_s2000/article/details/5510420
參考連接③:https://msdn.microsoft.com/zh-cn/library/system.diagnostics.conditionalattribute.aspx