C#中的#Define编译器指令

时间:2010-06-10 08:10:51

标签: c# compiler-directives

在C中,我可以按如下方式声明编译器指令:

#define MY_NUMBER 10

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

#define MY_NUMBER

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

这是正确的,还是我做错了什么?如果没有,任何人都可以建议在命名空间或解决方案级别执行此操作吗?我想过可能会创建一个静态类,但这对于一个值来说似乎有些过分。

6 个答案:

答案 0 :(得分:6)

是的,这是正确的。

以下是MSDN文档中的引用:

  

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

所以你无法真正定义编译器常量,比如在C和C ++中。

相关资源:

答案 1 :(得分:5)

许多其他答案建议使用public const字段。但请注意,public const将被编译为引用它的程序集,如果您更改了const的值,则不仅会强制您重新编译它定义的程序集,还会重新编译引用它的每个程序集。 / p>

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

答案 2 :(得分:3)

是的,你是对的。 constreadonly是您唯一的选择。

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

使用public const


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。