C#-#define條件編譯

C#的預處理器指令歷來不會轉化爲可執行代碼的命令,可是會影響編譯過程的各個方面,經常使用的預處理器指令有#define、#undef、#if,#elif,#else和#endif等等,下面介紹C#中使用#define進行條件編譯的實例。html

C#中條件編譯指令用於按條件包含或排除源文件中的某些部分。在Visual Studio中,會看到被排除的代碼顯示爲灰色。ide

1、#define能夠用來作什麼函數

一、當計劃發佈兩個版本的代碼的時候。即基本版和擁有更多版本的企業版,就能夠用到條件編譯指令;spa

二、例如同一個文件給silverlight、wpf、winform等使用,而且還考慮Debug和Release等,有大部分代碼是同樣的;操作系統

三、指定函數和屬性是否編譯到最終產品中去。.net

2、#define用法命令行

語法:#define 名稱code

注意:這裏名稱取Debug,你也能夠取其餘名稱如Dragonorm

1 #define Debug

說明:htm

一、Debug能夠看作是聲明的一個變量,但此變量沒有真正的值,存在時#if Debug結果爲true,不然爲false

二、#define單獨用沒什麼意義,通常是和#if或者Conditional特性結合使用;

三、#define必須定義在全部using命名空間前面;

四、DebugDEBUG是不一樣的,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 #if (Debug && Trace)
2 #define DebugAndTrace
3 #endif

使用Conditional屬性的方法受到如下限制:

一、條件方法必須是類聲明或結構聲明中的方法。若是在接口聲明中的方法上指定Conditional屬性,將出現編譯時錯誤;

二、條件方法不能是接口方法的實現。不然將發生編譯時錯誤;

三、條件方法必須具備void返回類型;

四、不能用override修飾符標記條件方法。可是,能夠用virtual修飾符標記條件方法。此類方法的重寫方法隱含爲有條件的方法,並且不能用Conditional屬性顯式標記。

環境變量(或條件編譯符號)的設置方法有三:

1)用#define定義以及#undef取消定義,在全部using命名空間前面定義;

2)用編譯器命令行選項(例如,/define:DEBUG),在「項目——右鍵——屬性——生成選項卡——常規欄」下的條件編譯符號(Y)中設置(若是多個,能夠用英文逗號隔開)。DEBUG版本下,系統默認設置了DEBUG和TRACE;

3)用操做系統外殼程序中的環境變量(例如,set DEBUG=1)。

參考連接①: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

相關文章
相關標籤/搜索