[英]Alternative to inlining in C#?
我使用以下語句將當前函數的名稱(例如,事件處理程序)打印到Visual Studio(2010)中的“輸出”窗口:
Debug.Write(MethodBase.GetCurrentMethod().Name);
如果我將它放在一個實用程序函數(如DisplayFunctionName()
,而不是調用它的父函數,那么每次顯示的內容都是“ DisplayFunctionName
” - 沒有驚喜!
我知道C#中沒有內聯,但是對於這種情況還有另一種解決方案,沒有使用“代碼片段”,以便不必復制這些語句嗎?
您可以使用CallerMemberNameAttribute
顯示呼叫者的姓名。
public void WriteDebug(string message, [CallerMemberName] string memberName = "")
{
Debug.Write("[" + memberName + "] " + message);
}
還有CallerLineNumberAttribute
和CallerFilePathAttribute
,您可以使用它來包含此信息以進行更多診斷。 這些屬性在MSDN上有詳細描述 。 結合方法上的[Conditional("DEBUG")]
,您可以在調試期間提供大量信息,並在發布版本中完全消除。
我知道C#中沒有內聯,但是對於這種情況還有另一種解決方案,沒有使用“代碼片段”,以便不必復制這些語句嗎?
請注意,這與“內聯”無關,與獲取調用成員的診斷信息無關。 話雖如此,JIT肯定會在您的代碼運行時執行內聯,這是C#具有良好性能的主要原因之一。
這需要Visual Studio 2012,因為它使用該版本中的新編譯器功能來運行。
如果您使用的是較舊的編譯器,另一種方法是使用StackTrace
來提取堆棧跟蹤信息。 然而,這具有相當顯着的性能影響,因此它不是我在緊密循環中使用的東西,至少在生產環境中不是這樣,盡管它在調試期間仍然可用於診斷。
string callingMethodName = (new StackTrace()).GetFrame(1).GetMethod().Name;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.