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