替代C#中的内联?

时间:2013-04-23 16:54:21

标签: c# inline-code

我使用以下语句将当前函数的名称(例如,事件处理程序)打印到Visual Studio(2010)中的“输出”窗口:

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

如果我把它放在诸如DisplayFunctionName()之类的实用程序函数中,而不是调用它的父函数,那么每次显示的内容都是“DisplayFunctionName” - 那里没有惊喜!

我知道C#中没有内联,但是对于这种情况还有另一种解决方案,没有使用“代码片段”,以免不得不复制这些语句吗?

1 个答案:

答案 0 :(得分:10)

您可以使用CallerMemberNameAttribute显示来电者的姓名。

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

您还可以使用CallerLineNumberAttributeCallerFilePathAttribute来包含此信息以进行更多诊断。这些属性为described in detail on MSDN。结合方法上的[Conditional("DEBUG")],您可以在调试期间提供大量信息,并在发布版本中完全消除。

  

我知道C#中没有内联,但是对于这种情况还有另一种解决方案,没有使用“代码片段”,以免不得不复制这些语句吗?

请注意,这与“内联”无关,与获取调用成员的诊断信息无关。话虽这么说,JIT肯定会在你的代码运行时执行内联,这是C#具有良好性能的主要原因之一。

这需要Visual Studio 2012,因为它使用该版本中的新编译器功能来运行。


如果您使用的是较旧的编译器,另一种方法是使用StackTrace来提取堆栈跟踪信息。然而,这对性能产生了相当大的影响,因此它不是我在紧密循环中使用的东西,至少在生产环境中不是这样,尽管它在调试期间仍然可用于诊断。

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