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