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

Posted

技术标签:

【中文标题】编译器指令 - 建议 - 仅在调试模式下运行代码【英文标题】:Compilter Directives - Suggestion - Run code in Debug mode only 【发布时间】:2011-07-04 08:23:10 【问题描述】:

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

第一:需要记录的时候需要到处写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);

我担心性能差异。

【问题讨论】:

【参考方案1】:

来自MSDN 页面的ConditionalAttribute:

将 ConditionalAttribute 应用于 方法向编译器表明 a 不应该调用该方法 编译到微软中间 语言 (MSIL) 除非有条件 关联的编译符号 定义了 ConditionalAttribute。

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

【讨论】:

【参考方案2】:

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

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

或者,

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

【讨论】:

【参考方案3】:

正如 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

【讨论】:

谢谢。问题:将 Log(string.Format("0 变成 1", i++, i));语句在汇编中编译?

以上是关于编译器指令 - 建议 - 仅在调试模式下运行代码的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio c++ 仅在调试模式下 LNK 1104 错误

Snackbar 问题(仅在调试模式下)

仅在 Flutter 的调试模式下运行的应用程序

程序仅在调试器外的发布模式下崩溃

当 NaN 仅在使用优化编译时出现时,如何开始调试数字代码?

Excel VBA数据验证交换仅在调试模式下工作