生成枚举值的常量

时间:2011-08-18 12:27:03

标签: c# enums

我需要在其常量中存储枚举条目的一些属性。例如,指示颜色是冷还是暖。

enum Colors
{
  Yellow, // warm
  Blue,   // cold
  Gray,   // cold
  Red,    // warm
  // etc.
}

在C ++中,我将定义一个宏来为常量生成位掩码。 类似的东西:

#define WARM 1
#define COLD 0

#define MAKECOLOR(index, type) ((index << 8) | type)

enum Colors
{
  Yellow = MAKECOLOR(0, WARM),
  Blue   = MAKECOLOR(1, COLD),
  Gray   = MAKECOLOR(2, COLD),
  Red    = MAKECOLOR(3, WARM),
  // etc.
}

在C#中,这是不可能的,因为没有宏。我想避免直接在枚举中写入位掩码表达式。像这样:

  ...
  Gray   = ((2 << 8) | 0),
  ...

有什么想法吗?

P.S。
是的,我是一个语法糖怪。 :d

3 个答案:

答案 0 :(得分:3)

您应该在枚举值中使用属性。阅读这篇文章,它非常好:

http://www.codeproject.com/KB/cs/enumwithdescription.aspx

希望它有所帮助!

答案 1 :(得分:2)

倾向于直接在枚举中写入位表达式:

enum Colors
{
    Yellow = (0 << 8) | ColorTemp.Warm,
    Blue   = (1 << 8) | ColorTemp.Cold,
    Gray   = (2 << 8) | ColorTemp.Cold,
    Red    = (3 << 8) | ColorTemp.Warm,
}

enum ColorTemp
{
    Cold = 0,
    Warm = 1,
}

然后在文件底部写一个简单的扩展类,如下所示:

public static class ColorsExtensions
{
    public ColorTemp GetTemperature(this Colors color)
    {
        return (ColorTemp)(color & 0x01);
    }
}

答案 2 :(得分:0)

在C#中,enum需要在编译时定义const个值。总之,C#比C ++更const

在C#中,const用于表示编译时常量表达式。它类似于这个C ++代码:

enum {
  count = buffer.Length;
}

因为buffer.Length是在运行时计算的,所以它不是常量表达式,因此会产生编译错误。

C#有readonly个关键字,与C ++的const更相似。 (虽然它仍然有限,但在C#中没有const-correctness这样的东西。)

const用于表示编译时常量...而不仅仅是一个只读值。

我不敢在C#中指定只读但非编译时常量的局部变量。一些局部变量本质上是只读的 - 例如foreach循环中的迭代变量以及using语句的第一部分中声明的任何变量。但是,您无法创建自己的只读变量。

如果在方法中使用const,则有效地将该标识符的任何用法替换为编译时常量值。

因此,您必须在enum的编译时定义您的值。它们无法在运行时进行评估。这些是规则。