2013-07-13 14 views
4

有什麼區別和對代碼的影響?MethodBase.GetCurrentMethod()。名稱與[CallerMemberName]

怎麼樣的性能和限制,什麼會更合適?

新屬性:
- [CallerFilePathAttribute]
- [CallerMemberName]
- [CallerLineNumber]

今天他們也是.NET 4可用的(很容易地開發,似乎魔法)..它們的值在運行時被編譯或解析?

+1

你需要什麼來使用它們?如果它們用於在異常期間報告堆棧跟蹤信息,則性能應該有點不相關。如果您使用它們來整個應用程序,那完全是另一回事。 –

+1

它們編譯爲:[「調用者信息值在編譯時以文字形式發送到中間語言(IL)中。」](http://msdn.microsoft.com/zh-cn/library/hh534540.aspx)編輯:性能明智,我從來沒有基準測試或大量使用它們,但我會懷疑它應該相當小,因爲大部分工作都是在編譯時完成的。 (雖然不確定性能問題或超級問題,但是使用基於反射的方法(如StackTrace或MethodBase.GetCurrentMethod())可能容易受到方法內聯或混淆。 –

回答

7

其一,MethodBase.GetCurrentMethod()返回當前方法,而你可以使用[CallerMemberName]等在有關調用方法到當前方法中的一些信息傳遞。

前者在運行時使用反射進行評估,因此相對較慢,而後者則在編譯時進行處理,並且基本上沒有運行性能。我已經在測試中驗證了這一點。反射將花費您每次大約20微秒的次數,如果經常調用,反射會非常顯着,而屬性不會導致可測量的損失。