簡體   English   中英

替代C#中的內聯?

[英]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);
}

還有CallerLineNumberAttributeCallerFilePathAttribute ,您可以使用它來包含此信息以進行更多診斷。 這些屬性在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM