7

在 C 中,我可以声明一个编译器指令,如下所示:

#define MY_NUMBER 10

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

#define MY_NUMBER

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

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

4

6 回答 6

6

是的,这是正确的。

这是 MSDN 文档中的一段话:

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

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

相关资源:

于 2010-06-10T08:21:51.413 回答
5

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

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

于 2010-06-10T09:16:08.940 回答
3

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

于 2010-06-10T08:13:29.900 回答
3

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

#if DEBUG
private const int MY_NUMBER = 10;
#else
private const int MY_NUMBER = 20;
#endif
于 2010-06-10T08:16:36.447 回答
1

使用公共常量


AFAIK,

C# 不使用预处理器定义来执行代码中的替换,因此您必须使用常量。

这应该可以解决问题:

public const int MY_NUMBER = 10;
于 2010-06-10T08:15:49.477 回答
1

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

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

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

于 2010-06-11T07:12:22.180 回答