Compitr指令-建议-仅在调试模式下运行代码

本文关键字:模式 运行 调试 代码 指令 建议 Compitr | 更新日期: 2023-09-27 18:01:08

只有当应用程序在调试模式下运行时,我才需要记录消息。我找到了两种方法:

第一个:当需要日志记录时,需要到处写3行。但是,Logger语句仅在编译时被禁用,这正是我所需要的。Logger.Log根本不会执行。

#if DEV_ENV
        Logger.Log("Application started !"); // This line is grayed. Perfect !
#endif
public static void Log(string message)
{
    Debug.WriteLine(message);
}

第二:非常整洁。只要需要日志记录,就只有一行代码。不确定是否执行Logger.Log语句如果只在编译时删除函数调用(与第一种方法相同。但是,现在可以肯定的是,由于代码行没有变灰(,我想继续这样做

Logger.Log("Application started !"); // This line is not grayed out. But, function is not called. So, confused whether its removed at compile time.
[Conditional("DEV_ENV")]
public static void Log(string message)
{
    Debug.WriteLine(message);
}

我担心性能差异

Compitr指令-建议-仅在调试模式下运行代码

从条件属性的MSDN页面:

将ConditionalAttribute应用于方法向编译器指示对方法的调用不应为编译到Microsoft中间版本语言(MSIL(,除非条件关联的编译符号定义了具有ConditionalAttribute的。

因此,正如它所说,方法调用在编译时被删除,与#if相同。

根据您的编译设置,您可以使用:

if (System.Diagnostics.Debugger.IsAttached)
   Logger.Log("Application started !"); 

或者,

#if DEBUG
    Logger.Log("Application started !"); 
#endif 

正如George所指出的,如果应用Conditional属性,则不会编译方法调用。这也意味着(就像直接使用#If DEV_ENV删除代码一样(方法调用中包含的任何副作用也不会发生——一如既往,关于日志代码中存在副作用的警告是有根据的:

public static void Main(String[] args)
{
    int i = 92;
    Log(string.Format("{0} became {1}", i++, i));
    Console.WriteLine(i);
    Console.ReadLine();
}
[Conditional("SKIP")]
private static void Log(string msg)
{
    Console.WriteLine(msg);
}

如果未定义SKIP,则此代码将打印出92。如果定义了SKIP,则打印92 became 9393

相关文章: