本教程演示條件方法,它們提供一種功能強大的機制,通過它可以根據是否定義了預處理器符號來包括或省略方法調用。
請參見“條件方法”示例以下載和生成本教程中討論的示例文件。
條件方法使開發人員能夠創建這樣的方法,可將對這些方法的調用放在代碼中,然後編譯期間根據預處理符號包括或省略這些調用。
假定您想在調試版本中啟用某些斷言代碼,而在發布版本中禁用它們。在 C++ 中,有不止一種方法可以將此功能包含到您的代碼中,例如:
C# 條件方法為該問題提供了簡單的解決方案,類似於上面列出的第一種方法。該操作有兩個基本機制:
條件方法用於“.NET Framework”中。System.Diagnostics 命名空間包含許多支持應用程序中的跟蹤和調試的類。使用 System.Diagnostics.Trace 和 System.Diagnostics.Debug 類向應用程序添加復雜的跟蹤和調試(使用條件方法可從發布版本編譯掉的功能)。
下面的示例展示如何使用條件方法實現非常簡單的跟蹤機制。System.Diagnostics.Trace 提供的跟蹤機制復雜得多,但它使用下面的基本機制提供該功能。
本示例由兩個源文件組成:第一個文件是提供跟蹤機制的庫,第二個文件是使用該庫的客戶程序。
下面的代碼展示了一個簡單的庫,它提供向系統控制台顯示跟蹤消息的跟蹤機制。客戶可以將跟蹤調用嵌入代碼,然後可以通過在自己的編譯階段中定義符號來控制是否調用跟蹤。
// CondMethod.cs // compile with: /target:library /d:DEBUG using System; using System.Diagnostics; namespace TraceFunctions { public class Trace { [Conditional("DEBUG")] public static void Message(string traceMessage) { Console.WriteLine("[TRACE] - " + traceMessage); } } }
下面的代碼行:
[Conditional("DEBUG")]
將 Message
方法標記為條件方法(通過 Conditional 屬性)。Conditional 屬性采用一個參數(預處理標識符),該標識符控制編譯客戶代碼時是否包括方法調用。如果定義了預處理標識符,則調用方法;否則從不將調用插入客戶代碼。
關於哪些方法可以標記為條件方法存在一些限制;有關更多信息,請參見“C# 語言規范”中的 17.4.2 Conditional 屬性。
下面的客戶程序使用文件 #1 中定義的 Trace
類來執行一些簡單跟蹤。
// TraceTest.cs // compile with: /reference:CondMethod.dll // arguments: A B C using System; using TraceFunctions; public class TraceClient { public static void Main(string[] args) { Trace.Message("Main Starting"); if (args.Length == 0) { Console.WriteLine("No arguments have been passed"); } else { for( int i=0; i < args.Length; i++) { Console.WriteLine("Arg[{0}] is [{1}]",i,args[i]); } } Trace.Message("Main Ending"); } }
編譯客戶代碼時,根據是否定義了預處理標識符來決定在客戶代碼中是否包含條件代碼。
用 /d:DEBUG 標志編譯客戶代碼意味著編譯器插入對 Trace
方法的調用。如果未定義該符號,則從不調用。
命令為:
tracetest A B C
給出以下輸出:
[TRACE] - Main Starting Arg[0] is [A] Arg[1] is [B] Arg[2] is [C] [TRACE] - Main Ending
命令為:
tracetest
給出以下輸出:
[TRACE] - Main Starting No arguments have been passed [TRACE] - Main Ending