为枚举值生成常量
本文关键字:常量 枚举 | 更新日期: 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
表示编译时常数…不只是一个只读值。
foreach
循环中的迭代变量和using
语句第一部分中声明的任何变量。但是,您不能创建自己的只读变量。
如果你在一个方法中使用const
,它将有效地用编译时常量值替换该标识符的任何用法。
因此,您必须在编译时在enum
中定义您的值。它们不能在运行时求值。