当我修复代码时,我在任何地方都放了一个调试打印代码,当我完成它时,我没有删除它们,而是添加了一个注释,这样当接下来发生错误时,我就可以取消注释并打印出来数据。
(我不习惯断点调试和检查变量,我发现把调试打印我可以得到我希望消息显示更好的时间。)
如果可能的话,我希望能够更轻松地打开和关闭调试代码,但由于它们都是分散的,因此注释/取消注释很痛苦。放置#if预处理器应该可以工作,但一行调试打印#if Debug #endif到处都是3 行。
所以我有一个想法,用我自己的方法包装调试方法,在它里面只是#if在实际调试方法之前检查。我的问题是当#if指令为假时函数变为空,编译后的代码是否仍会跳转到这个空函数?我特别担心这个空方法是否在核心游戏循环中并且每秒被调用数千次。
另外如果真的被剥离了,我想知道参数数据是否保留在程序中?例如,如果我编写MyDebug("Encryption key : " + key);该方法为空时该字符串是否会保留在代码中?
编译器不会删除空方法,因为它无法知道它们不会被调用(即使它们是私有的 - 由于反射)。
但是,您可以使用ConditionalAttribute与 .Net 对Debug.WriteLine()等相同的方式来执行此操作:
[Conditional("DEBUG")]
public static void MyDebugOnlyMethod()
{
...
}
Run Code Online (Sandbox Code Playgroud)
这将导致编译器从已编译的代码中省略该方法及其所有调用,除非在编译时定义了“DEBUG”条件符号。
这比使用 #if DEBUG ... #endif 更具可读性
另请注意,您不必使用“DEBUG”——您可以使用您想要的任何其他字符串,但您必须在需要时使用#define或通过在项目设置中设置条件编译符号来定义它。