2009-06-29 46 views
3

最近,我已具有很多診斷日誌記錄在我的代碼部分的模式,即利用lambda表達式/匿名委託的,像這樣:是否有可能擁有太多的匿名代表?

MyEventManager.LogVerbose(LogCategory.SomeCategory,() => String.Format(msg_string, GetParam1(), GetParam2(), GetParam3()); 

注意,第二個參數LogVerbose是一個lambda表達式,其值爲一個字符串。原因是如果詳細日誌記錄實際上沒有啓用,LogVerbose應該退出儘可能少的工作,以便將性能影響降至最低。在某些情況下,錯誤消息字符串的構造可能需要時間或資源,並且如果lambda表達式從未被評估過,則不會發生性能損失。

我想知道是否拋棄類似這樣的匿名代理的類型系統會對應用程序性能產生一些無法預料的後果,或者是否應該考慮其他任何策略。

回答

2

應該沒問題。特別是,如果你的匿名函數沒有捕獲任何東西,它將被緩存爲一個靜態字段(因爲它可以)。如果你捕獲「this」,那麼你最終會創建新的委託實例,但它們並不昂貴。

如果你捕獲局部變量,這將涉及到實例化一個嵌套類型 - 但我只擔心這個,如果你看到它實際上成爲一個問題。與最優化一樣,首先關注可讀性,衡量性能,然後對其進行分析以找出需要集中精力的地方。

+0

這是我懷疑的,這是技術上的理由。 – jlew 2009-06-29 17:18:18

2

雖然實際上我並不確定這個問題的答案,但我認爲值得考慮的是,如果有人提出某種類型的建議,那麼在C#中推動更實用的編程風格將被嚴重破壞限制使用這些表達方式。

2

我有一個解決方案,有成千上萬的匿名代表,它仍然有效。有時Visual Studio有點笨拙,但是這是因爲我們有數百個項目,或者這個或其他因素未知。應用程序的性能似乎並沒有受到很大的影響(通過相當多的性能測試)。

相關問題