概述

    #if/#endif 語句常用來基於同一份原始碼生成不同的編譯結果,其中最常見的就是debug版和release版。但是這些工具在實際應用中並不是非常友好,因為它們容易被濫用,其內碼表進而難以理解或除錯。C#設計中考慮到這個問題,並提供了更好的工具——Conditional特性,用來為不同的環境編譯不同的機器碼。Conditional特性適用於方法的層面,這將強制我們將條件程式碼拆分為獨立的方法。在需要編寫條件程式碼時,我們應該使用Conditional特性來替代#if/#endif。

功能描述

使用#if/#endif 語句的缺點

  例如編寫一個私有方法來獲取呼叫它的函式名稱:

private string CheckMethod()
{ #if DEBUG
Trace.WriteLine("Entering CheckState for Person"); string methodName = new StackTrace().GetFrame().GetMethod().Name; return methodName;
#endif
return null;
}

更好的解決辦法——使用Conditional特性

  為了避免出現上面的問題我們可以使用Conditional特性。使用Conditional特性即可將一些函式拆分出來,讓其只有在定義了某些環境變數或者設定了某個值之後才能編譯併成為類的一部分。Conditional特性最常用的地方就是講一段程式碼變成除錯語句。使用Conditional特性的隔離策略要比#if/#endif不容易出錯。

看下面的程式碼:

       [Conditional("DEBUG")]
private void CheckMethod()
{
Trace.WriteLine("Entering CheckState for Person");
string methodName = new StackTrace().GetFrame().GetMethod().Name;
}

Conditional特性的限制

Conditional特性只可以應用在整個方法上。

任何使用了Conditional特性的方法都只能返回void型別。

功能擴充套件

我們可以配置解決方案檔案,來決定編譯時候執行的程式碼,流程如下:

1、配置解決方案資訊:

2、編寫程式碼約束:

    [Conditional("IN_MEMORY")]
private static void ConfigureInMemory()
{
................................................
} [Conditional("NHIBERNATE")]
private static void ConfigureInMemory()
{
      ................................................
     }

程式碼生成的時候,我們就可以根據Conditional來決定編譯走的流程;