在C++中,您可以使用预处理器定义宏来完全阻止代码的执行,例如:
#define VLOG(level,expr) if (level >= g_log.verbosity) { g_log.output << expr; }
使用方法如下:
VLOG(5,"Expensive function call returns " << ExpensiveFunctionCall());
如何在C#中实现这个功能?
我已经阅读了微软文档(链接),它们声称使用 #undef DEBUG 和 #undef TRACE 可以从生成的可执行文件中删除所有跟踪和调试代码,但它是否真的删除了整个调用呢?也就是说,如果我写下:
System.Diagnostics.Trace.WriteLineIf(g_log.verbosity>=5,ExpensiveFunctionCall());
如果我取消定义TRACE,它会不会调用我的昂贵函数?还是会先调用,然后决定不追踪任何内容?
无论如何,即使它删除了它,这仍然不如C++宏,因为我不能让那个丑陋的大调用看起来像C++中的简单VLOG()调用,而且仍然避免评估参数,对吗?我也不能像在C++中一样在运行时通过定义较低的详细程度来避免开销,对吗?
var i=0;Debug.WriteLine(i++);Console.WriteLine("i = " + i);
- gatopeich