2011-02-17 104 views
9

據我瞭解,像Debug.WriteLine()這樣的語句不會留在發佈版本的代碼中。另一方面Trace.WriteLine()將留在版本構建中的代碼中。 什麼是控制這種行爲?定義DEBUG時,C#編譯器是否會忽略System.Diagnostics.Debug類中的所有內容?C調試vs跟蹤#

我只是想了解C#的內部,只是好奇。

+1

提示:自己發現此類事物的答案的一種方法是在Red Gate的[.Net Reflector](http://reflector.r)中查看此類方法。 ed-gate.com/download.aspx)。我想你也可以下載框架源代碼。請注意,.Net Reflector將很快停止使用。這是一個非常有用的工具,所以我建議現在下載它。 – Brian 2011-02-17 15:46:44

回答

6

這些方法使用ConditionalAttribute來指定它們應該包含在什麼時候。

DEBUG被(在殼set DEBUG = 1)指定爲#define,經由the command line或系統環境中,標有[Conditional("DEBUG")]的方法將由編譯器被包括在內。當不包括DEBUG時,這些方法和對它們的任何調用都將被省略。您可以自己使用此機制以在某些情況下包含方法,並且還可以用於控制Trace調用,如Trace.WriteLine(這使用TRACE定義)。

5

這是由於ConditionalAttribute;編譯器將忽略對標記爲有條件的方法的調用,除非定義了該符號。

你可以有你自己:

[Conditional("BLUE")] 
void Bar() {...} 

定義BLUE時纔會被調用。

注意,有一些限制,使「明確賦值」的工作:

  • 沒有返回值
  • 沒有out參數

(相同限制適用於partial方法類似原因)