2011-06-14 41 views
4

我需要在我的软件中记录很多信息以进行调试。 但是我只在开发过程中需要这个选项,我宁愿在Release中排除所有这些代码。如何添加调试代码? (应该去调试,不应该去发布)

我当然可以环绕我想用“如果”来调试的地方:

if (isDebugMode()) { 
    Logger.log(blahblah); 
} 

但是因为我的软件是相当时间关键,我想避免了很多unnesseray“如果”测试。

I.e.我想我需要c的模拟“#define #ifdef #ifndef”。 c#或.net中是否有任何技术可以轻松解决我的任务?

回答

13

您可以在Logger.log方法的前面使用[ConditionalAttribute("DEBUG")],这样它只会在调试模式下编译并在发布模式下完全删除。

这就是Debug类方法都是如何标记的。

与使用#if方法相比,优势在于具有Conditional属性的代码在运行时甚至不存在,并且对它的所有引用都被删除,而不是留在那里的空的主体(或者,有条件地编译它)。

+0

哦,我更喜欢那个。甚至不知道这一点,谢谢;) – 2011-06-14 16:31:11

+0

是的,C#人真的讨厌预处理器,所以他们试图在实际代码中做所有有用的东西。我个人对此总体上有着复杂的感受,但在这种情况下,最好是这样:) – Blindy 2011-06-14 16:32:48

+0

是的,我赞成像上面提出的构想。我在C或C++中完成了大部分开发工作,但仍然使用C#已经有四年了,并且还有很多新的东西供我学习。再次感谢+1 – 2011-06-14 16:35:07

7

为什么你不使用DEBUG符号?

#if DEBUG 
    // debug only code here 
#endif 

Here is an article描述所有在C#中为您提供的预处理指令的,而你也能在你的项目的属性菜单来定义自己的预处理器变量。

+0

感谢,不知道这 – javapowered 2011-06-14 16:39:12

+0

但如何我可以在“调试”模式下自动将#define DEBUG(也它不应该被“释放”定义模式)。或者我应该每次都开启(评论/开卷)#define DEBUG? – javapowered 2011-06-14 16:42:09

+0

它由编译器为您完成。如果您在定义的符号下查看更多调试,您会发现'DEBUG'。 – Blindy 2011-06-14 16:49:14

2

您可以使用此作为本机的替代调试仅登录:

Debug.Write("blah blah"); 

,如果这是一个调试版本将只被记录。

1

条件属性可以帮助在这种情况下。

事情是这样的:

class DebugModeLogger 
{ 
    [Conditional("DEBUG")] 
    public static void WriteLog(string message) 
    { 
     //Log it 
    } 
} 

摘自MSDN: 属性条件允许的条件方法的定义。条件属性通过测试条件编译符号来指示条件。调用条件方法可以包含或省略,具体取决于该符号是否在调用点定义。如果定义了符号,则包含呼叫;否则,该呼叫(包括呼叫参数的评估)被省略。

3

正如其他人所说,你可以使用“预处理”指令的组合:

#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/