C# 为枚举值生成的常量

C# 为枚举值生成的常量,c#,enums,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, // 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.
}
#定义温暖1
#定义冷0

#定义MAKECOLOR(index,type)((index您应该在枚举值处使用属性。阅读本文,它非常好:

希望有帮助!

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

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,
}
<>在C++中,EnUM/COD>需要在编译时定义<代码> const 值。总之,C比C++更为<代码> const >

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

enum {
  count = buffer.Length;
}
因为
buffer.Length
是在运行时计算的,所以它不是一个常量表达式,因此会产生编译错误

C#有一个
readonly
关键字,它与C++的
const
更为相似(尽管它仍然非常有限,而且C#中没有const正确性)

const
表示编译时常量…而不仅仅是只读值

恐怕不能在C#中指定只读但非编译时常量的局部变量。有些局部变量本质上是只读的,例如
foreach
循环中的迭代变量和使用
语句在
的第一部分声明的任何变量。但是,您不能创建自己的只读变量

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


因此,您必须在编译时在
enum
中定义值。它们不能在运行时计算。这些是规则。

这是如何获取属性的。相反,我需要一种方法来定义它。@armen:这是唯一正确的方法。否则,它将不起作用。好主意。唯一的问题是e的速度有多快属性的赋值。此解决方案的性能会受到使用反射的影响。如果要在其值中包含每个枚举成员的属性以提高速度,则最好使用单独的温/冷数组,并使用枚举成员的整数值作为索引(例如
warmcold[(int)Colors.Gray]
。我认为它更快。嗯,它们是通过反射来访问的,所以不要期望光速。嗯,像
(3@Vlad:我在C#中尝试了一个静态函数调用,编译器抱怨它必须是一个常量。当我像@Virtlink那样做时,它工作了,因为它是在编译时在
枚举
中计算的。这基本上意味着该语言的优化器很害羞,不想显示它的全部计算常量编译时的表达式,并不是根本不可能。毕竟,所考虑的表达式是编译时常数。@弗拉德:这也是我所想的,除了VisualStudio 2010附带的编译器不允许我这样做,这样就导致了我不能用C +像C++那样简单地进行。
public static class ColorsExtensions
{
    public ColorTemp GetTemperature(this Colors color)
    {
        return (ColorTemp)(color & 0x01);
    }
}
enum {
  count = buffer.Length;
}