当我修复代码时,我把调试打印代码放在任何地方,当我完成它时,我没有删除它们但是发表评论,以便当bug出现在这附近时,我将能够取消注释并获取它打印出数据。
(我不习惯断点调试和检查变量,我发现调试打印我可以得到我希望消息看起来更好的时间。)
如果可能的话,我希望能够更容易地打开和关闭调试代码,但由于它们都是分散的,因此评论/取消注释是一种痛苦。放置#if
预处理器应该可以工作,但是单行调试打印在任何地方变为3行#if
Debug
#endif
。
所以我有一个想法用我自己的方法包装调试方法,并且在实际的调试方法之前只需#if
进行检查。我的问题是,当#if
指令为false时,函数变为空,编译的代码是否仍会跳转到此空函数?我特别担心,如果这个空方法在核心游戏循环中并且每秒被调用数千次。
如果它真的被剥离了,我想知道参数数据是否仍然在程序中?例如,如果我写MyDebug("Encryption key : " + key);
,如果方法为空,那么该字符串是否会保留在代码中?
答案 0 :(得分:4)
编译器不会删除空方法,因为它无法知道它们不会被调用(即使它们是私有的 - 由于反射)。
但是,您可以使用ConditionalAttribute
执行此操作,就像.Net为Debug.WriteLine()
等执行此操作一样:
[Conditional("DEBUG")]
public static void MyDebugOnlyMethod()
{
...
}
除非在编译时定义“DEBUG”条件符号,否则这将导致编译器从编译代码中省略该方法及其所有调用。
这比使用#if DEBUG ... #endif
更具可读性另请注意,您不必使用“DEBUG” - 您可以使用您想要的任何其他字符串,但您必须在需要时使用#define
或通过设置条件编译符号来定义它在项目设置中。
答案 1 :(得分:1)
最佳做法是将代码插入调试模式区域:
#if DEBUG
//your code here
#endif
它将仅在调试模式下编译和工作
答案 2 :(得分:1)
三种方式:
1)检查调试器是否附加。
if (Debugger.IsAttached){
// do }
2)要知道是否在程序中的任何地方进行调试。声明全局变量。
bool isOnDebug=false;
创建用于检查调试模式的函数。
[ConditionalAttribute("DEBUG")]
public static void isOnDebugMethod()
{
isOnDebug = true;
}
在initialize方法中调用函数
isOnDebugMethod();
3)#if预处理器指令
#if DEBUG
private /*static*/ bool bisdegug= false;
#endif