如何添加调试代码?(应该转到“调试”,不应该转到“发布”)
本文关键字:调试 发布 不应该 何添加 添加 代码 | 更新日期: 2023-09-27 17:59:19
我需要在软件中记录大量信息以进行调试。然而,我只在开发过程中需要这个选项,我更愿意在Release中排除所有这些代码。
当然,我可以用"if"包围我想调试的地方:
if (isDebugMode()) {
Logger.log(blahblah);
}
但因为我的软件非常耗时,我想避免很多不必要的"如果"测试。
也就是说,我想我需要c的模拟"#define#ifdef#ifndef"。c或.net中有什么技术可以轻松地解决我的任务吗?
您可以在Logger.log
方法前面使用[ConditionalAttribute("DEBUG")]
,因此它只能在调试模式下编译,并在发布模式下完全删除。
这就是所有Debug
类方法的标记方式。
与使用#if
方法相比,这样做的好处是,具有Conditional
属性的代码在运行时甚至不存在,并且对它的所有引用都会被删除,而不是停留在那里,留下一个空的正文(或者有条件地编译它)。
为什么不使用DEBUG
符号?
#if DEBUG
// debug only code here
#endif
这里有一篇文章描述了C#中所有可用的预处理器指令,您还可以在项目的属性菜单中定义自己的预处理器变量。
正如其他人所提到的,您可以使用"预处理器"指令的组合:
#if DEBUG
ThisWholeSectionIsTreatedAsACommentIfDEBUGIsNotDefined();
#endif
条件属性:
Debug.Assert(x); // Call will be removed entirely in non-debug build because it has conditional attr
然而,重要的是要认识到,其中一个是程序的词汇分析的一部分,另一个是语义的一部分。很容易混淆。我关于差异的文章可能会有所帮助:
http://ericlippert.com/2009/09/10/whats-the-difference-between-conditional-compilation-and-the-conditional-attribute/
您可以将其用作仅调试日志记录的本机替代方案:
Debug.Write("blah blah");
只有当这是一个调试构建时才会记录。
Conditional属性在这种情况下可能会有所帮助。
类似这样的东西:
class DebugModeLogger { [Conditional("DEBUG")] public static void WriteLog(string message) { //Log it } }
MSDN摘录:Conditional属性可用于定义条件方法。Conditional属性通过测试条件编译符号来指示条件。对条件方法的调用是包含还是省略,这取决于是否在调用点定义了此符号。如果定义了符号,则包含调用;否则,调用(包括调用参数的评估)被省略。