動態檢索變數名稱:探索使用反射和C# 6.0 nameof 的替代方案
編譯為Intermediate 後取得變數的名稱語言(ILIL )是程式設計中常見的挑戰。在本文中,我們將深入研究如何利用反射來解決這個問題,反射是 .NET 中的一項強大功能,讓我們在執行時間檢查有關類型和成員的元資料。
反射的限制
最初,我們可能會考慮利用反射來檢索變數名稱。然而,值得注意的是,變數在編譯後不會在 IL 中保留其名稱。因此,僅依靠反射不會產生預期的結果。
輸入表達式樹和閉包:一種解決方法
儘管反射有局限性,但仍然存在一個巧妙的解決方法。透過使用表達式樹,我們可以將變數提升為閉包。該技術本質上在編譯時捕獲變數的上下文,允許我們稍後使用 GetVariableName
實作和使用
這是示範此方法的範例:
此方法透過從正文中擷取MemberExpression 實例來操作所操作所提供的lambda 表達式。然後,MemberExpression 的 Member 屬性會儲存變數的名稱。
缺點和性能注意事項
雖然此解決方法規避了反射的限制,但它也帶來了性能缺陷。多個物件的創建、過多的不可內聯方法呼叫以及大量反射的使用可能會導致延遲。因此,建議避免在效能關鍵的程式碼路徑中使用此方法。
C# 6.0 的關鍵字名稱:更簡單的解決方案
隨著 C# 6.0 的出現,一個更直接的解決方案出現了:nameof 關鍵字。這個關鍵字提供了一種簡潔方便的方法來在編譯時存取變數、屬性或方法的名稱。
在我們原來的範例中,我們現在可以使用nameof 輕鬆檢索變數名稱,如下所示:
nameof 關鍵字提供與GetVariableName 方法相同的功能,但具有改進的功能
結論
在.NET中檢索變數名稱需要仔細考慮。雖然反射和表達式樹提供了在運行時獲取變數名稱的解決方法,但必須考慮它們的效能影響。相較之下,C# 6.0 的 nameof 關鍵字消除了這些效能問題,並為該任務提供了更有效的解決方案。
以上是如何在 C# 中動態檢索變數名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!