在 C 中,我可以声明一个编译器指令,如下所示:
#define MY_NUMBER 10
但是,在 C# 中,我似乎只能这样做:
#define MY_NUMBER
在这种情况下,这显然是无用的。
这是正确的,还是我做错了什么?如果没有,任何人都可以在命名空间或解决方案级别建议一种方法吗?我想也许可以创建一个静态类,但这对于一个值来说似乎有点过头了。
在 C 中,我可以声明一个编译器指令,如下所示:
#define MY_NUMBER 10
但是,在 C# 中,我似乎只能这样做:
#define MY_NUMBER
在这种情况下,这显然是无用的。
这是正确的,还是我做错了什么?如果没有,任何人都可以在命名空间或解决方案级别建议一种方法吗?我想也许可以创建一个静态类,但这对于一个值来说似乎有点过头了。
是的,这是正确的。
这是 MSDN 文档中的一段话:
预处理指令提供有条件地跳过源文件部分、报告错误和警告条件以及描绘源代码的不同区域的能力。术语“预处理指令”仅用于与 C 和 C++ 编程语言保持一致。在 C# 中,没有单独的预处理步骤;预处理指令作为词法分析阶段的一部分进行处理。
所以你不能真正定义编译器常量,就像在 C 和 C++ 中一样。
相关资源:
许多其他答案建议使用public const
字段。但是请注意, apublic const
将被编译为引用它的程序集,这会迫使您不仅重新编译它定义的程序集,而且如果您更改了const
.
如果您不确定该值永远不必更改,public static readonly
则字段是更好的选择。
是的,你是对的。 const
并且readonly
确实是您唯一的选择。
您可以定义一个 const 或一个 static readonly,如果您有条件地想要它,您可以将它包装在 #if 指令中
#if DEBUG
private const int MY_NUMBER = 10;
#else
private const int MY_NUMBER = 20;
#endif
AFAIK,
C# 不使用预处理器定义来执行代码中的替换,因此您必须使用常量。
这应该可以解决问题:
public const int MY_NUMBER = 10;
您可能还想检查枚举,例如
enum Numbers
{
Nothing = 0,
Dads = 5,
My = 10,
LittleJims = 25
}
所以,你有 Numbers.My,而不是 C 的 MY_NUMBER。