C#编译器会剥离出空方法吗?

时间:2018-03-13 08:40:45

标签: c# compilation

当我修复代码时,我把调试打印代码放在任何地方,当我完成它时,我没有删除它们但是发表评论,以便当bug出现在这附近时,我将能够取消注释并获取它打印出数据。

(我不习惯断点调试和检查变量,我发现调试打印我可以得到我希望消息看起来更好的时间。)

如果可能的话,我希望能够更容易地打开和关闭调试代码,但由于它们都是分散的,因此评论/取消注释是一种痛苦。放置#if预处理器应该可以工作,但是单行调试打印在任何地方变为3行#if Debug #endif

所以我有一个想法用我自己的方法包装调试方法,并且在实际的调试方法之前只需#if进行检查。我的问题是,当#if指令为false时,函数变为空,编译的代码是否仍会跳转到此空函数?我特别担心,如果这个空方法在核心游戏循环中并且每秒被调用数千次。

如果它真的被剥离了,我想知道参数数据是否仍然在程序中?例如,如果我写MyDebug("Encryption key : " + key);,如果方法为空,那么该字符串是否会保留在代码中?

3 个答案:

答案 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