2011-11-28 279 views
34

在Visual Studio 2010中,如果轉到項目的屬性並轉到生成選項卡,則會出現「定義TRACE常量」複選框。這相當於做了一個#define TRACE。在.NET/Visual Studio中定義TRACE常量

System.Diagnostics.Trace的所有方法的周圍都有一個[Conditional("TRACE")]

我的問題是爲什麼你有沒有把這個關掉?我的意思是,如果你沒有定義任何跟蹤監聽器,那麼它就不會像你要填寫日誌或什麼東西。對我來說感覺很奇怪。如果你正在努力調用Trace,爲什麼你不想通過App/Web.config來控制它,而是通過一個編譯器開關來控制它,這樣就排除了無需重新開啓的可能性重新編譯。

我錯過了什麼嗎?當然,它不會對性能有害,對吧?

+5

即使沒有偵聽器,調用Trace()也不是免費的。使它非常昂貴並不困難。 –

+0

雖然我認爲它不夠細化。您可能只想跟蹤部署中的某些類型的事件(警告,錯誤)以便記錄它們;而在調試中,您可能需要一切(信息,詳細信息等)。應該確實有TRACE_ERROR,TRACE_VERBOSE等。 – luksan

+0

有關TRACE和優化構建的更多信息,請參閱http://stackoverflow.com/questions/6911863/setting-up-ac-sharp-application-for-max-performance-build 。 – MBentley

回答

27

推測該複選框相當於/define:TRACE編譯器選項。您可能希望關閉發佈版本的此選項,因爲您不希望最終用戶出於某種原因(例如安全性)查看跟蹤輸出或提高性能。當然,性能增加將取決於打開時正在進行的工作量,但Conditional attribute將導致編譯器從生成的IL中完全刪除函數調用(包括任何字符串格式化等),因此它可能會使用有很大的不同。

+1

將函數調用完全刪除而非將調用替換爲no-op會準確嗎?後者對我來說聽起來好像你將會把NOP放入IL中,但是鏈接的MSDN頁面並沒有提示它。 – Ashe

+2

謝謝,你是對的(由Jon Skeet在[this thread](http://bytes.com/topic/c-sharp/answers/237540-conditional-debug-if-debug)底部的答案證實)。我糾正了我的答案。 –