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