我可以在 C# 中修饰一个方法,使其仅在调试版本中编译吗?

Can I decorate a method in C# such that it is compiled only in debug versions?

我知道您可以在 C# 中使用 #if DEBUG 和类似的东西,但是是否可以创建一个完全忽略的方法或 class,包括所有的用法不是 包裹在 #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 语言的行为是否相同(即,编译时与 运行 时优化)。

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

您似乎在寻找 ConditionalAttribute

例如,这是 Debug class source code 的一部分:

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);
    }
 ................................

你可以用[Conditional("DEBUG")]修饰你的方法,让它只在debug模式下执行,不会在Release模式下执行。

您可以在 MSDN 上阅读有关条件属性的更多信息,内容如下:

The Conditional attribute is often used with the DEBUG identifier to enable trace and logging features for debug builds but not in release builds

我在一些地方看到了下面的方法,虽然它可能不是最好的方法。

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") 调用。

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