我想在我的C#应用程序中添加日志记录或跟踪,但是如果将日志详细级别设置得太低以至于不记录消息,我不希望记录格式化字符串或计算值的开销.
在C++中,您可以使用预处理器来定义将阻止代码执行的宏,如下所示:
#define VLOG(level,expr) if (level >= g_log.verbosity) { g_log.output << expr; }
Run Code Online (Sandbox Code Playgroud)
像这样使用:
VLOG(5,"Expensive function call returns " << ExpensiveFunctionCall());
Run Code Online (Sandbox Code Playgroud)
你是怎么用C#做的?
我读过的微软文档解释了跟踪和调试设施在这里,他们声称,使用和#undef DEBUG和#undef TRACE删除所有从生产的可执行文件跟踪和调试代码,但它真的删除整个通话?意思是,如果我写的话
System.Diagnostics.Trace.WriteLineIf(g_log.verbosity>=5,ExpensiveFunctionCall());
Run Code Online (Sandbox Code Playgroud)
如果我取消定义TRACE,它不会调用我昂贵的功能吗?或者是打电话,然后决定它不会追踪任何东西?
无论如何,即使它确实删除它,这也不如C++宏,因为我无法使那个大丑陋的调用看起来像我在C++中的简单VLOG()调用,仍然可以避免评估参数,是吗?我也不能像在C++中那样在运行时定义详细程度来避免开销,对吧?