程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 程序員參考--條件辦法教學文章

C# 程序員參考--條件辦法教學文章

編輯:C#入門知識

本教程演示條件方法,它們提供一種功能強大的機制,通過它可以根據是否定義了預處理器符號來包括或省略方法調用。

示例文件

請參見“條件方法”示例以下載和生成本教程中討論的示例文件。

教程

條件方法使開發人員能夠創建這樣的方法,可將對這些方法的調用放在代碼中,然後編譯期間根據預處理符號包括或省略這些調用。

假定您想在調試版本中啟用某些斷言代碼,而在發布版本中禁用它們。在 C++ 中,有不止一種方法可以將此功能包含到您的代碼中,例如:

  • 使用 #ifdef 同時定義宏的調試版本和發布版本。調試版本調用跟蹤代碼,而發布版本不執行任何操作。由於 C# 不支持宏,該方法行不通。
  • 具有正在被調用的代碼的兩個實現。即,在調試版本中,具有完全功能;而在發布版本中,具有方法的空存根 (stub)。然後,用戶在鏈接項目時選擇包括哪一個實現。該方法的問題是,發布版本包含對空方法的調用,並且配置較復雜。

C# 條件方法為該問題提供了簡單的解決方案,類似於上面列出的第一種方法。該操作有兩個基本機制:

  • 直接在源代碼中用 #define 定義預處理標識符。
  • 通過 /define 選項 (/d) 在 C# 命令行上定義預處理標識符。下面的示例中使用該方法。

條件方法用於“.NET Framework”中。System.Diagnostics 命名空間包含許多支持應用程序中的跟蹤和調試的類。使用 System.Diagnostics.TraceSystem.Diagnostics.Debug 類向應用程序添加復雜的跟蹤和調試(使用條件方法可從發布版本編譯掉的功能)。

下面的示例展示如何使用條件方法實現非常簡單的跟蹤機制。System.Diagnostics.Trace 提供的跟蹤機制復雜得多,但它使用下面的基本機制提供該功能。

示例

本示例由兩個源文件組成:第一個文件是提供跟蹤機制的庫,第二個文件是使用該庫的客戶程序。

文件 #1:創建條件方法

下面的代碼展示了一個簡單的庫,它提供向系統控制台顯示跟蹤消息的跟蹤機制。客戶可以將跟蹤調用嵌入代碼,然後可以通過在自己的編譯階段中定義符號來控制是否調用跟蹤。

// 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 屬性。

文件 #2:使用條件方法

下面的客戶程序使用文件 #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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved