條件編譯&條件屬性
1.#if/#else/#endif條件編譯
條件編譯語句關鍵字爲:#if#else,#endif。下面直接通過一個例子說明其用法:
#if NET35 || NET20 using System.Web.UI.WebControls.WebParts; #else //如果是NET10時,不編譯任何代碼 #endif |
上面的條件符號NET35和NET20是我們自己定義的一些字符串,注意在命名時不要隨便定義無意義的條件符號。那麼編譯系統怎麼肯定會了解我們定義的這些NET35,NET20條件符號呢?下面就說明條件符號是怎麼通知編譯器的,右擊控件庫項目,選擇"屬性"命令,會打開項目屬性配置窗口,選擇左邊的"生成"選項卡,會看到在"常規"下面有一項就是讓我們設置條件編譯符號的,如圖3-4所示。
(點擊查看大圖)圖3-4 設置條件編譯符號 |
除了以上對命名空間進行條件編譯,用得更多的是對功能代碼語句進行條件編譯。也舉一個例子,代碼如下:
#if NET35 || NET20 if (this.DesignMode) { //功能A語句 } else { //功能B語句 } #else //功能B語句 #endif |
以上是講的條件編譯功能,使用了條件編譯功能無須改變代碼,只要根據不同的開發環境修改一下編譯條件符號就可以滿足同一份代碼支持跨版本功能。
2.條件屬性
除了條件編譯,C#還提供了條件屬性(Conditional attribute)來根據當前環境決定哪些方法是否應該被調用。直接通過一個例子說明其使用方法,代碼如下:
/// <summary> /// 獲得本書更多內容,請看: /// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx /// </summary> [Conditional("StartDebug")] private void TraceDebug(string str) { if (String.IsNullOrEmpty(str) == true) { Trace.WriteLine("值爲NULL!"); } //Trace, Debug, Record log to database etc } |
System.Diagnostics.Debug System.Diagnostics.Trace |
TraceDebug方法使用很簡單,可以在任意想調試的地方調用此方法。下面的設計屬性語句:
[Conditional("StartDebug")] |
這裏的條件屬性用在方法上,因爲使用它的最小單位是方法,上面的#if,#else最小單位是語句,當然也可以是方法(只要使用#if,#else把方法嵌套起來)。條件屬性方式也有很多優點,使用條件屬性可以比使用#if,#endif生成更高效的IL代碼;而且代碼看起來比#if,#else方式要清晰些,尤其是像上面的代碼較多的TraceDebug方法,如果嵌入到程序代碼中看起來是非常亂的。
本節講的方法各有優缺點,可以根據需求和自己愛好選擇,目的是把開發成本減少到最小。
本節內容不僅用於控件開發,對於整個ASP.NET應用程序開發也是如此。