【问题标题】:#Define Compiler Directive in C##在 C# 中定义编译器指令
【发布时间】:2011-03-02 01:25:06
【问题描述】:

在 C 语言中,我可以如下声明编译器指令:

#define MY_NUMBER 10

但是,在 C# 中,我似乎只能这样做:

#define MY_NUMBER

在这种情况下,这显然是无用的。

这是正确的,还是我做错了什么?如果没有,任何人都可以在命名空间或解决方案级别建议一种方法吗?我想也许可以创建一个静态类,但这对于一个值来说似乎有点过头了。

【问题讨论】:

    标签: c# compiler-directives


    【解决方案1】:

    使用公共常量


    阿法伊克,

    C# 不使用预处理器定义来执行代码替换, 所以你必须使用一个常量。

    这应该可以解决问题:

    public const int MY_NUMBER = 10;
    

    【讨论】:

      【解决方案2】:

      您可能还想检查枚举,例如

      enum Numbers
      {
          Nothing = 0,
          Dads = 5,
          My = 10,
          LittleJims = 25
      }
      

      所以,你有 Numbers.My,而不是 C 的 MY_NUMBER。

      【讨论】:

        【解决方案3】:

        许多其他答案建议使用public const 字段。但是请注意,public const 将被编译为引用它的程序集,这迫使您不仅要重新编译定义它的程序集,而且如果您更改了 const 的值,还需要重新编译引用它的每个程序集。

        如果您不确定该值永远不会改变,public static readonly 字段是更好的选择。

        【讨论】:

        • 谢谢;这真的很有帮助!我从来不知道。
        • @RobertFraser 是的,枚举从不意味着要改变,它们只是整数常量,顶部带有花哨的编译器魔法 (Source)。更重要的是,这种重大更改在运行时被捕获的可能性很小,在编译中被捕获的可能性几乎为零。使用您的枚举/常量的程序集可能仍会运行,但可能会开始表现出随机行为。所以永远不要改变公共常量。不知道这会造成什么样的破坏,或者在发现问题之前造成了多大的损害!如果有疑问,请使用只读。
        • @AnorZaken 我不禁觉得这是一个设计错误。它甚至不是优化,因为 JIT 可以像编译器一样进行常量折叠。哦,好吧,事后看来是 20/20。
        • @RobertFraser Eric Lippert 很久以前在这里发表了评论,他称枚举实现是 C# 中最大的设计错误。这并不是因为它是一个常数,而是因为 a) 从 C++ 中模仿旧枚举是一个丑陋的 hack(框架中的所有枚举代码都非常不稳定并污染了整个类型系统),b) 因为它服务于两个不同的目的——命名常量和标志——所以它应该被分成两种不同的类型(就像在 Java 中一样)。就我个人而言,我不认为常量是一个错误,但也许编译器应该在 const 公开时警告你。
        【解决方案4】:

        是的,没错。

        这是 MSDN 文档中的一段话:

        预处理指令提供 有条件地跳过的能力 源文件的部分,以报告 错误和警告条件,并 划定不同的源区域 代码。术语“预处理 指令”仅用于 与 C 和 C++ 的一致性 编程语言。在 C# 中,有 没有单独的预处理步骤; 预处理指令是 作为词汇的一部分处理 分析阶段。

        所以你不能像在 C 和 C++ 中那样真正定义编译器常量。

        相关资源:

        【讨论】:

          【解决方案5】:

          你可以定义一个 const 或一个 static readonly,如果你想有条件地使用它,你可以将它包装在一个 #if 指令中

          #if DEBUG
          private const int MY_NUMBER = 10;
          #else
          private const int MY_NUMBER = 20;
          #endif
          

          【讨论】:

            【解决方案6】:

            是的,你是对的。 const 和 readonly 确实是您唯一的选择。

            【讨论】:

              猜你喜欢
              • 2011-02-24
              • 2019-11-06
              • 2023-03-23
              • 2012-10-12
              • 1970-01-01
              • 1970-01-01
              • 2015-02-27
              • 1970-01-01
              • 2012-06-18
              相关资源
              最近更新 更多