我可以在c#中修饰一个方法,使其只在调试版本中编译吗?
本文关键字:调试 编译 版本 一个 我可以 方法 | 更新日期: 2023-09-27 18:13:04
我知道你可以在c#中使用#if DEBUG
和类似的东西,但是是否有可能创建一个完全被忽略的方法或类,包括而不是包装在#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
类源代码的一部分:
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")]
修饰你的方法,这样它只在调试模式下执行,而不会在发布模式下执行。
你可以在MSDN上阅读更多关于条件属性的信息,它说:
条件属性通常与
DEBUG
标识符一起使用,以启用调试版本的跟踪和日志功能,但在发布版本中不使用
我在一些地方看到过下面的方法,尽管它可能不是最好的方法。
public static class Debug
{
public static bool IsInDebugMode { get; set; }
public static void Print(string message)
{
if (IsInDebugMode) Console.Write(message);
}
}
你可以在你的主方法中设置IsInDebugMode
布尔值,然后调用所有的Debug.Print("yolo")
。
编辑:这当然可以用额外的包装器来扩展格式化输出,使用自动换行符等等。