條件編譯&條件屬性

條件編譯&條件屬性

在實際開發中,經常需要根據不同運行環境下生成相應的機器代碼。最愚蠢的辦法是根據不同的環境註釋掉相應的語句,或者取消對需要的語句的註釋,這樣每換一次環境就必須修改代碼。爲了解決這個問題,.NET Framework提供了一些支持:條件編譯和條件屬性。
1.#if/#else/#endif條件編譯
條件編譯語句關鍵字爲:#if#else,#endif。下面直接通過一個例子說明其用法:
#if NET35 || NET20
using System.Web.UI.WebControls.WebParts;
#else
//如果是NET10時,不編譯任何代碼
#endif
以上代碼意思是如果.NET Framework至少是2.0以上版本,纔會打開WebParts命名空間,因爲在.NET Framework 1.0還不支持WebParts控件。在條件編譯代碼語句中的符號&&(並且)和||(或者)跟普通C#代碼語句中的&&和||符號含義相同。再強調一下,以上的條件編譯符號的作用是指在編譯時是否會編譯語句中的語句,而不是運行時。
上面的條件符號NET35和NET20是我們自己定義的一些字符串,注意在命名時不要隨便定義無意義的條件符號。那麼編譯系統怎麼肯定會了解我們定義的這些NET35,NET20條件符號呢?下面就說明條件符號是怎麼通知編譯器的,右擊控件庫項目,選擇"屬性"命令,會打開項目屬性配置窗口,選擇左邊的"生成"選項卡,會看到在"常規"下面有一項就是讓我們設置條件編譯符號的,如圖3-4所示。
(點擊查看大圖)圖3-4  設置條件編譯符號
如果您使用的是VS 2008就設置NET35;如果使用的是VS 2005,就設置NET20即可,並且此項設置支持使用分號隔開,能寫多個符號。還要注意對於系統自己使用的一些關鍵字如DEBUG等,就不能使用了(即使設置了,系統也不會保存)。
除了以上對命名空間進行條件編譯,用得更多的是對功能代碼語句進行條件編譯。也舉一個例子,代碼如下:
#if NET35 || NET20
if (this.DesignMode)
{
//功能A語句
}
else
{
//功能B語句
}
#else
//功能B語句
#endif
這段代碼表明this.DesignMode屬性在.NET Framework 2.0或更高版本,才支持通過設置條件編譯在不同開發環境下實現不同的代碼,並且保證即使在.NET framework 1.0環境下編譯也不會出錯。
以上是講的條件編譯功能,使用了條件編譯功能無須改變代碼,只要根據不同的開發環境修改一下編譯條件符號就可以滿足同一份代碼支持跨版本功能。
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
}
以上方法主要完成調試功能。在實際應用中可以使用.NET Framework提供的一些跟蹤調試類,比如:
System.Diagnostics.Debug
System.Diagnostics.Trace
來進行跟蹤和調試,例如Debug類的Degbug.Assert斷言方法等;或者採用定義自己的輸出方式,比如記錄到數據庫等,來跟蹤和調試。
TraceDebug方法使用很簡單,可以在任意想調試的地方調用此方法。下面的設計屬性語句:
[Conditional("StartDebug")]
表示只能定義了"StartDebug"的條件符號,此方法纔會執行;否則,當執行到此方法時會自動跳過此方法,繼續執行下面的語句。設置"StartDebug"條件符號的規則與1中講的#if,#else等條件編譯一樣,也是在項目屬性配置窗口設置,請參考1中的講解。
這裏的條件屬性用在方法上,因爲使用它的最小單位是方法,上面的#if,#else最小單位是語句,當然也可以是方法(只要使用#if,#else把方法嵌套起來)。條件屬性方式也有很多優點,使用條件屬性可以比使用#if,#endif生成更高效的IL代碼;而且代碼看起來比#if,#else方式要清晰些,尤其是像上面的代碼較多的TraceDebug方法,如果嵌入到程序代碼中看起來是非常亂的。
本節講的方法各有優缺點,可以根據需求和自己愛好選擇,目的是把開發成本減少到最小。
本節內容不僅用於控件開發,對於整個ASP.NET應用程序開發也是如此。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章