2013-04-23 65 views
3

我用下面的語句來打印當前函數的名稱(例如,一個事件處理程序)在Visual Studio Output窗口(2010):替代在C#中內聯?

Debug.Write(MethodBase.GetCurrentMethod().Name); 

如果我把這個實用的功能,例如內作爲DisplayFunctionName(),而不是調用它的父函數,每次顯示的內容是「DisplayFunctionName」 - 沒有意外!

我知道C#中沒有內聯,但是在這種情況下是否存在另一種解決方案,即使用「片段」,以便不必重複這些語句?

+2

「在C#中沒有內聯?」。醒來:-) – 2013-04-23 16:56:14

+1

是的,肯定有內聯在C#中。如果沒有內聯,你不會獲得這種性能... – evanmcdonnal 2013-04-23 16:56:55

+0

我的意思是「C++類型宏」意義上的內聯。 – Sabuncu 2013-04-23 17:13:56

回答

10

您可以使用CallerMemberNameAttribute來顯示來電者的姓名。

public void WriteDebug(string message, [CallerMemberName] string memberName = "") 
{ 
    Debug.Write("[" + memberName + "] " + message); 
} 

還有CallerLineNumberAttributeCallerFilePathAttribute您可以使用包含這些信息的詳細診斷。這些屬性是described in detail on MSDN。與該方法上的[Conditional("DEBUG")]相結合,您可以在調試期間提供大量信息,這些信息在發佈版本中完全消除。

我知道C#中沒有內聯,但是在這種情況下還有另一種解決方案,使用'snippets',以便不必重複這些語句?

請注意,這與「內聯」直接無關,與獲取調用成員的診斷信息一樣多。這就是說,JIT在您的代碼運行時絕對執行內聯,這是C#具有良好性能的主要原因之一。

這需要Visual Studio 2012,因爲它使用該版本中的新編譯器功能來運行。


如果您使用的是較舊的編譯器,另一種方法是使用​​拉出堆棧跟蹤信息。然而,這對性能有相當大的影響,所以它不是在緊密的循環中使用,至少不是在生產環境中使用,儘管它在調試期間仍然可用於診斷。

string callingMethodName = (new StackTrace()).GetFrame(1).GetMethod().Name; 
+2

有關更多詳細信息,請參閱http://msdn.microsoft.com/en-us/library/hh534540.aspx。 – DeCaf 2013-04-23 16:57:59

+0

裏德,謝謝+1。我有Visual Studio 2010,並在我的項目中使用.NET 4.0。 CallerMemberName未定義。將安裝.NET 4.5修復這種情況?搜索結果表明,VS 2010可能無法實現。 – Sabuncu 2013-04-23 17:27:51

+1

@Sabuncu您需要使用VS 2012 - 這是一個編譯器功能。您仍然可以定位.NET 4(如果您自己實現這些屬性),因爲它純粹是一種編譯器功能,但它在VS 2010中不起作用。 – 2013-04-23 17:30:12