c#中内联的替代方案
本文关键字:方案 | 更新日期: 2023-09-27 18:10:26
我使用以下语句将当前函数的名称(例如,事件处理程序)打印到Visual Studio(2010)的Output窗口:
Debug.Write(MethodBase.GetCurrentMethod().Name);
如果我把它放在一个实用程序函数中,比如DisplayFunctionName()
,而不是调用它的父函数,每次显示的是"DisplayFunctionName
"——没有什么奇怪的!
我知道c#中没有内联,但是对于这种情况是否有另一种解决方案,除了使用"片段",这样就不必重复这样的语句了?
您可以使用CallerMemberNameAttribute
显示呼叫者的姓名。
public void WriteDebug(string message, [CallerMemberName] string memberName = "")
{
Debug.Write("[" + memberName + "] " + message);
}
还有CallerLineNumberAttribute
和CallerFilePathAttribute
,您可以使用它们来包含此信息以进行更多诊断。这些属性在MSDN上有详细的描述。结合该方法上的[Conditional("DEBUG")]
,您可以在调试期间提供大量信息,而这些信息在发布版本中是完全消除的。
我知道c#中没有内联,但是对于这种情况是否有另一种解决方案,除了使用"片段",这样就不必重复这样的语句了?
请注意,这实际上与"内联"没有直接关系,而是与获取调用成员的信息以进行诊断有关。也就是说,当你的代码运行时,JIT肯定会执行内联,这是c#具有良好性能的主要原因之一。
这需要Visual Studio 2012,因为它使用了该版本中的新编译器特性。
如果您使用的是较旧的编译器,另一种选择是使用StackTrace
提取堆栈跟踪信息。但是,这会对性能产生相当大的影响,因此我不会在紧密循环中使用它,至少不会在生产环境中使用它,尽管它仍然可以在调试期间进行诊断。
string callingMethodName = (new StackTrace()).GetFrame(1).GetMethod().Name;