为枚举值生成常量

本文关键字:常量 枚举 | 更新日期: 2023-09-27 18:06:04

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

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),
  ...

任何想法?

注:
是的,我是个语法糖狂。: D

为枚举值生成常量

应该在枚举值中使用属性。阅读这篇文章,它很不错:

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

希望有帮助!

I do倾向于直接在enum中写入位表达式:

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);
    }
}

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

在c#中,const用于表示编译时常量表达式。它类似于下面的c++代码:

enum {
  count = buffer.Length;
}

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

c#有一个readonly关键字,它有点类似于c++的const。(它仍然有更多的限制,并且在c#中没有const-正确性这类东西)。

const表示编译时常数…不只是一个只读值。

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

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

因此,您必须在编译时在enum中定义您的值。它们不能在运行时求值。