1

我知道您可以#if DEBUG在 C# 中使用和类似的东西,但是是否可以创建一个完全被忽略的方法或类,包括包​​装在#if DEBUG块内的所有用法?

就像是:

[DebugOnlyAttribute]
public void PushDebugInfo()
{
    // do something
    Console.WriteLine("world");
}

接着:

void Main()
{
    Console.WriteLine("hello ");
    Xxx.PushDebugInfo();
}

其中,如果DEBUG定义将打印“hello world”,否则将打印“hello”。但更重要的是,MSIL 根本不应该在发布版本中包含方法调用。

我相信我所追求的行为类似于 Debug.WriteLine,它的调用被完全删除,并且对发布版本中的性能或堆栈深度没有影响。

并且,如果可能在 C# 中,任何使用此方法的 .NET 语言的行为是否相同(即,编译时与运行时优化)。

还标记,因为基本上我在那里需要这个方法。

4

3 回答 3

6

看来您正在寻找ConditionalAttribute.

例如,这是Debug类源代码的一部分:

static partial class Debug
{
    private static readonly object s_ForLock = new Object();

    [System.Diagnostics.Conditional("DEBUG")]
    public static void Assert(bool condition)
    {
        Assert(condition, string.Empty, string.Empty);
    }

    [System.Diagnostics.Conditional("DEBUG")]
    public static void Assert(bool condition, string message)
    {
        Assert(condition, message, string.Empty);
    }
 ................................
于 2015-09-17T09:40:23.620 回答
1

您可以装饰您的方法[Conditional("DEBUG")],使其仅在调试模式下执行,而不会在发布模式下执行。

您可以在MSDN上阅读有关 Conditional 属性的更多信息,其中说:

Conditional 属性通常与DEBUG标识符一起使用,以启用调试版本的跟踪和日志记录功能,但不在发布版本中

于 2015-09-17T09:41:40.357 回答
1

我已经看到在某些地方使用了以下方法,尽管它可能不是最好的方法。

public static class Debug
{
    public static bool IsInDebugMode { get; set; }

    public static void Print(string message)
    {
        if (IsInDebugMode) Console.Write(message);
    }
}

然后,您可以在 main 方法中的某处设置IsInDebugMode布尔值并进行Debug.Print("yolo")所有调用。

编辑:这当然可以通过额外的格式化输出包装器、自动换行符等进行扩展。

于 2015-09-17T09:42:57.690 回答