如何添加调试代码?(应该转到“调试”,不应该转到“发布”)

本文关键字:调试 发布 不应该 何添加 添加 代码 | 更新日期: 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属性通过测试条件编译符号来指示条件。对条件方法的调用是包含还是省略,这取决于是否在调用点定义了此符号。如果定义了符号,则包含调用;否则,调用(包括调用参数的评估)被省略。