条件调试 - 它是否还会编译为发布版代码?

6

我知道如果把代码标记为DEBUG模式,在RELEASE模式下就不能运行,但它还是会编译成程序集吗? 我只是想确认我的程序集不会因为额外的方法而变得臃肿。

[Conditional(DEBUG)]
private void DoSomeLocalDebugging()
{
   //debugging
}
1个回答

11

是的,该方法本身仍然会根据你的编译进行构建。

这是完全合理的-因为Conditional的重点是依赖于调用者构建时定义的预处理器符号,而不是被调用者构建时定义的符号。

简单测试-构建这个:

using System;
using System.Diagnostics;

class Test
{
    [Conditional("FOO")]
    static void CallMe()
    {
        Console.WriteLine("Called");
    }

    static void Main()
    {
        CallMe();
    }
}

如果你运行这段代码(在没有定义FOO的情况下),你会发现没有输出,但是如果你在Reflector中查看,你会看到该方法仍然存在。

换句话说,你认为.NET发布的程序集(我们编译时使用的那些程序集)是否定义了DEBUG符号?如果没有(我强烈怀疑它们没有!),那么我们如何调用Debug.Assert等方法呢?

不可否认,当你构建私有方法时,不包括DEBUG符号可能更合适,但正如你所看到的,它仍然被构建了,这对于简洁性和一致性来说也是合理的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接