【发布时间】:2010-09-20 13:07:21
【问题描述】:
对于 C++ __FUNCTION__ 宏的 C# 版本,是否有人有好的解决方案?编译器似乎不喜欢它。
【问题讨论】:
对于 C++ __FUNCTION__ 宏的 C# 版本,是否有人有好的解决方案?编译器似乎不喜欢它。
【问题讨论】:
尝试改用这个。
System.Reflection.MethodBase.GetCurrentMethod().Name
C# 没有像 C++ 这样的 __LINE__ 或 __FUNCTION__ 宏,但有等价物
【讨论】:
我目前使用的是这样的函数:
using System.Diagnostics;
public string __Function() {
StackTrace stackTrace = new StackTrace();
return stackTrace.GetFrame(1).GetMethod().Name;
}
当我需要 __FUNCTION__ 时,我只需调用 __Function() 即可。例如:
Debug.Assert(false, __Function() + ": Unhandled option");
当然,这个解决方案也使用反射,但它是我能找到的最佳选择。由于我只将它用于调试(而不是在发布版本中进行跟踪),因此对性能的影响并不重要。
我想我应该做的是创建调试函数并标记它们
[ Conditional("Debug") ]
相反,但我还没有考虑过。
感谢 Jeff Mastry 对此的solution。
【讨论】:
不幸的是,C# 中没有该宏的等效版本。我不认为 GetCurrentMethodName() 解决方案等同于 C++ __FUNCTION__ 宏。即因为 C++ 版本是名称的编译时计算。对于 C#,这是一个运行时计算,会导致性能下降。
我没有对成本的严重性做出任何假设,但有一个
【讨论】:
以下应该可以工作,尽管它将在运行时而不是在编译期间进行评估。
System.Reflection.MethodBase.GetCurrentMethod().Name
【讨论】:
我用这个:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
用法示例:
s_log.DebugFormat("{0}", CallerName());
使用它的缺点是每次要打印调用者姓名时,都需要跳转到函数 ==> 耗时&性能下降! 因此,我将它用于调试目的,如果我还需要在生产代码中打印,我通常将函数名称内联到 log.Debug 中,例如:
s_log.Debug("CallerName");
HTH..
【讨论】:
【讨论】: