我使用以下语句将当前函数的名称(例如,事件处理程序)打印到Visual Studio(2010)中的"输出"窗口:
Debug.Write(MethodBase.GetCurrentMethod().Name);
Run Code Online (Sandbox Code Playgroud)
如果我把它放在一个实用程序函数中DisplayFunctionName(),而不是调用它的父函数,每次显示的是" DisplayFunctionName" - 那里没有惊喜!
我知道C#中没有内联,但是对于这种情况还有另一种解决方案,没有使用"代码片段",以便不必复制这些语句吗?
Ree*_*sey 10
您可以使用它CallerMemberNameAttribute来显示呼叫者的姓名.
public void WriteDebug(string message, [CallerMemberName] string memberName = "")
{
Debug.Write("[" + memberName + "] " + message);
}
Run Code Online (Sandbox Code Playgroud)
也有CallerLineNumberAttribute和CallerFilePathAttribute您可以使用包含这些信息的详细诊断.这些属性在MSDN上有详细描述.结合使用[Conditional("DEBUG")]该方法,您可以在调试期间提供大量信息,并在发布版本中完全消除.
我知道C#中没有内联,但是对于这种情况还有另一种解决方案,没有使用"代码片段",以便不必复制这些语句吗?
请注意,这与"内联"无关,与获取调用成员的诊断信息无关.话虽如此,JIT肯定会在您的代码运行时执行内联,这是C#具有良好性能的主要原因之一.
这需要Visual Studio 2012,因为它使用该版本中的新编译器功能来运行.
如果您使用的是较旧的编译器,则另一种方法是使用StackTrace提取堆栈跟踪信息.然而,这具有相当显着的性能影响,因此它不是我在紧密循环中使用的东西,至少在生产环境中不是这样,尽管它在调试期间仍然可用于诊断.
string callingMethodName = (new StackTrace()).GetFrame(1).GetMethod().Name;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |