6

我知道如果我将代码标记为 DEBUG 代码,它将不会在 RELEASE 模式下运行,但它仍然会被编译成程序集吗?我只是想确保我的程序集不会因额外的方法而臃肿。

[Conditional(DEBUG)]
private void DoSomeLocalDebugging()
{
   //debugging
}
4

1 回答 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等?

诚然,当您构建私有方法时,不包含它是有意义的 - 但正如您所看到的,它仍然构建的 - 这对于简单性和一致性来说是合理的。

于 2010-08-13T13:47:12.583 回答