我可以在 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 语言的行为是否相同(即,编译时与 运行 时优化)。
也标记了f#,因为基本上我会在那里需要这个方法。
您似乎在寻找 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")
调用。
编辑:这当然可以通过额外的格式化输出包装器、自动换行符等进行扩展。
我知道您可以在 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 语言的行为是否相同(即,编译时与 运行 时优化)。
也标记了f#,因为基本上我会在那里需要这个方法。
您似乎在寻找 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")
调用。
编辑:这当然可以通过额外的格式化输出包装器、自动换行符等进行扩展。