? ? ? 概述
#if/#endif 語句常用來基于同一份源碼生成不同的編譯結果,其中最常見的就是debug版和release版。但是這些工具在實際應用中并不是非常友好,因為它們容易被濫用,其代碼頁進而難以理解或調試。C#設計中考慮到這個問題,并提供了更好的工具——Conditional特性,用來為不同的環境編譯不同的機器碼。Conditional特性適用于方法的層面,這將強制我們將條件代碼拆分為獨立的方法。在需要編寫條件代碼時,我們應該使用Conditional特性來替代#if/#endif。
? ? ? 功能描述
使用#if/#endif 語句的缺點
例如編寫一個私有方法來獲取調用它的函數名稱:
private string CheckMethod(){#if DEBUGTrace.WriteLine("Entering CheckState for Person");string methodName = new StackTrace().GetFrame(1).GetMethod().Name;return methodName; #endifreturn null;}
更好的解決辦法——使用Conditional特性
為了避免出現上面的問題我們可以使用Conditional特性。使用Conditional特性即可將一些函數拆分出來,讓其只有在定義了某些環境變量或者設置了某個值之后才能編譯并成為類的一部分。Conditional特性最常用的地方就是講一段代碼變成調試語句。使用Conditional特性的隔離策略要比#if/#endif不容易出錯。
看下面的代碼:
[Conditional("DEBUG")]private void CheckMethod(){Trace.WriteLine("Entering CheckState for Person");string methodName = new StackTrace().GetFrame(1).GetMethod().Name;}
Conditional特性的限制
Conditional特性只可以應用在整個方法上。
任何使用了Conditional特性的方法都只能返回void類型。
? ? ? 功能擴展
我們可以配置解決方案文件,來決定編譯時候運行的代碼,流程如下:
1、配置解決方案信息:
?
2、編寫代碼約束:
[Conditional("IN_MEMORY")]private static void ConfigureInMemory(){................................................ }[Conditional("NHIBERNATE")]private static void ConfigureInMemory(){
................................................
}
?
代碼生成的時候,我們就可以根據Conditional來決定編譯走的流程;
?