【问题标题】:C# Conditional equivalent of !DEBUG [duplicate]C# 条件等效于 !DEBUG [重复]
【发布时间】:2014-10-11 05:44:28
【问题描述】:

什么是 C# System.Diagnostics.Conditional 等效于 #if (!DEBUG)

如果控制台应用程序的 app.config 文件的一部分尚未在 DEBUG 模式下编译,我想对其进行加密。这是这样实现的:

public static void Main(string[] args)
{
    #if (!DEBUG)
    ConfigEncryption.EncryptAppSettings();
    #endif
    //...
}

但不知何故,我更喜欢用条件属性装饰 encrypt 方法:

[Conditional("!DEBUG")]
internal static void EncryptAppSettings()
{
    //...
}

然而这让编译器很伤心:The argument to the 'System.Diagnostics.ConditionalAttribute' attribute must be a valid identifier...

否定条件参数的正确语法是什么?

编辑: 感谢@Gusdor,我使用了这个(我更喜欢让 Program.cs 文件没有 if/else 调试逻辑):

#if !DEBUG
#define ENCRYPT_CONFIG
#endif

[Conditional("ENCRYPT_CONFIG")]
internal static void EncryptAppSettings()
{
    //...
}

【问题讨论】:

  • 感谢您指出重复的人。我没能找到它。可悲的是,那里接受的答案是“无法完成”,而在这里我设法找到了解决方案。 :)

标签: c# conditional debug-symbols


【解决方案1】:
#if DEBUG
    // do nothing
#else
   //your code here
#endif

【讨论】:

  • 这样做的问题是,在正常开发过程中,#else 块中的任何内容都可能停止编译(例如,在重构之后),并且在您下次以发布模式构建之前,您不会变得更聪明。 stackoverflow.com/questions/25361149/…
  • @Dan 更多的是关于 CI/CD 管道的工作情况,而不是解决方案本身
  • 我不是指 CI/CD 管道。我说的是编译器。如果您在调试模式下构建应用程序,那么编译器将不会尝试编译 #else 块中的任何内容,反之亦然。这意味着如果在代码的其他地方重构了一些破坏了 #else 块中的某些内容的内容,那么在调试模式下构建时您将不会知道它。
【解决方案2】:

使用该属性会有点麻烦,但可以做到。

#if DEBUG
//you have nothing to do here but c# requires it
#else
#define NOT_DEBUG //define a symbol specifying a non debug environment
#endif

[Conditional("NOT_DEBUG")]
internal static void EncryptAppSettings()
{
    //...
}

【讨论】:

  • 这对调用代码的要求是相当大的;当你控制一切时它会起作用,但我不确定它在一般情况下是否能正常工作
  • 谢谢!我的实现基于您的想法(只是放弃了else 逻辑以支持否定)。
  • @MarcGravell 如果我运行一个新堆栈,你能说明一些它会失败的情况吗?
  • 我的意思是,在 library 场景中; [Conditional(...)] 是图书馆的一部分。如果对于库的使用者来说并不明显,他们需要开始添加编译器符号以使库正常运行。
  • 为什么不只是? #if !DEBUG #define NOT_DEBUG //定义一个符号指定非调试环境 #endif `
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2012-12-13
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多