是否可以在.NET中创建仅调试方法?

时间:2009-09-17 15:31:48

标签: .net debugging

是否可以创建一个执行调试帮助的方法,如System.Diagnostics.Debug类?

我正在寻找一种方法来构造一个方法,该方法在由定义的DEBUG条件编译符号编译的程序集调用时,导致操作,并且在没有定义符号的程序集调用时是无操作的

如果可能的话,我希望对调试方法的调用可以增加最小的开销或增加大小的发布版本。

为了澄清,调试方法应该在Release模式下编译的程序集中。对方法的调用只应在从具有在方法调用范围内定义的DEBUG符号的程序集调用时生成操作。

5 个答案:

答案 0 :(得分:31)

Conditional属性添加到方法中,如下所示:

[Conditional("DEBUG")]
public void Whatever() {
    //...
}

请注意,该方法必须返回void,并且不能包含任何out个参数;否则,就无法删除对它的调用。

该方法将被编译到程序集中,但是如果正在编译的程序集定义了DEBUG,则符合CLS的编译器将仅发出对该方法的调用。请注意,C ++编译器不符合CLS,并始终发出调用。

答案 1 :(得分:6)

ConditionalAttribute

BTW被调用方法的代码保留在程序集中 - 它是在编译时删除的对它的调用

Bonus主题博文:http://blogs.msdn.com/ericlippert/archive/2009/09/10/what-s-the-difference-between-conditional-compilation-and-the-conditional-attribute.aspx

答案 2 :(得分:3)

如果使用Reflector反汇编System.Diagnostics.Debug类,您可以看到使用[Conditional("DEBUG")]属性完成此操作:

public sealed class Debug
{
    private Debug();
    [Conditional("DEBUG")]
    public static void Assert(bool condition);
    // etc...
}

答案 3 :(得分:1)

如果你需要另一个签名而不是void func(..)而没有输出参数,

会出现什么问题
MyDebugObject Foo(out int justForGrins)
{
    justForGrins = <safe value for release builds>;
    MyDebugObject result = <safe value for release builds>;
    #if DEBUG
     .. run code you need for your debugging...
    #endif
     return result;
}

它比ConditionalAttribute更详细,更不优雅,但它可以让你更灵活的签名。

答案 4 :(得分:0)

为什么不尝试这样的事情?

#if DEBUG
        private void DebugLog(string message)
        {
            // do whatever u want.
        }
#endif