在C#开发中,我们经常会遇到需要检查多个枚举值的情况。为了使代码更加简洁和可读,我们可以利用[Flags]特性和按位操作符来简化枚举值的比较
public enum EnumShapeType { None = 0, PointType, LineType, CircleType, BoxType, RectangleType, SphereType, CutFeatureType, CommonFeatureType, SweepFeatureType, FuseFeatureType, FilletFeatureType, HoleFeatureType, ExtrudeFeatureType, RevolveFeatureType, PolygonFaceFeatureType, PointsLineFeatureType, PlanarFaceFeatureType } if(enumShapeType == EnumShapeType.BoxType || enumShapeType == EnumShapeType.SphereType || enumShapeType == EnumShapeType.LineType || enumShapeType == EnumShapeType.PointType || enumShapeType == EnumShapeType.RectangleType) { // Your code here }
这段代码检查enumShapeType是否为EnumShapeType枚举中的五种特定类型之一:BoxType、SphereType、LineType、RectangleType和PointType
具体来说,代码使用多个逻辑或 (||) 运算符来逐一比较enumShapeType与每个目标枚举值。这种方法虽然直观,但当枚举值较多时,代码会变得冗长且难以维护
可以使用Enum
类的HasFlag
方法来简化这段代码
确保你的枚举类型具有[Flags]
特性,每个枚举成员的值是2的幂(1, 2, 4, 8, 等),以确保它们的二进制表示形式是唯一的,这是使用[Flags]
特性的关键。这样可以正确地使用按位操作符
[Flags] public enum EnumShapeType { None = 0, PointType= 1 << 0, LineType = 1 << 1, CircleType = 1 << 2, BoxType = 1 << 3, RectangleType = 1 << 4, SphereType = 1 << 5, CutFeatureType = 1 << 6, CommonFeatureType = 1 << 7, SweepFeatureType = 1 << 8, FuseFeatureType = 1 << 9, FilletFeatureType = 1 << 10, HoleFeatureType = 1 << 11, ExtrudeFeatureType = 1 << 12, RevolveFeatureType = 1 << 13, PolygonFaceFeatureType = 1 << 14, PointsLineFeatureType = 1 << 15, PlanarFaceFeatureType = 1 << 16 }
1 << n
表示将1左移n位,相当于2的n次方
以下是每个枚举值及其对应的数值:
枚举值 | 数值 | 二级制 | 十六进制数值 |
---|---|---|---|
None | 0 | 0000 0000 0000 0000 | 0x0 |
PointType | 1 | 0000 0000 0000 0001 | 0x1 |
LineType | 2 | 0000 0000 0000 0010 | 0x2 |
CircleType | 4 | 0000 0000 0000 0100 | 0x4 |
BoxType | 8 | 0000 0000 0000 1000 | 0x8 |
RectangleType | 16 | 0000 0000 0001 0000 | 0x10 |
SphereType | 32 | 0000 0000 0010 0000 | 0x20 |
CutFeatureType | 64 | 0000 0000 0100 0000 | 0x40 |
CommonFeatureType | 128 | 0000 0000 1000 0000 | 0x80 |
SweepFeatureType | 256 | 0000 0001 0000 0000 | 0x100 |
FuseFeatureType | 512 | 0000 0010 0000 0000 | 0x200 |
FilletFeatureType | 1024 | 0000 0100 0000 0000 | 0x400 |
HoleFeatureType | 2048 | 0000 1000 0000 0000 | 0x800 |
ExtrudeFeatureType | 4096 | 0001 0000 0000 0000 | 0x1000 |
RevolveFeatureType | 8192 | 0010 0000 0000 0000 | 0x2000 |
PolygonFaceFeatureType | 16384 | 0100 0000 0000 0000 | 0x4000 |
PointsLineFeatureType | 32768 | 1000 0000 0000 0000 | 0x8000 |
PlanarFaceFeatureType | 65536 | 1 0000 0000 0000 0000 | 0x10000 |
注意
C#中枚举(enum)的默认基础类型是int。这意味着在没有明确指定基础类型的情况下,枚举的每个成员将被存储为一个32位的有符号整数 (int)
对于int类型,使用位标志枚举时的最大值是2147483648(1 << 31)
如果需要更多的标志位,可以将枚举的基础类型更改为long,这样可以定义最多64个标志位
[Flags] public enum EnumShapeType : long { None = 0, PointType = 1L << 0, LineType = 1L << 1, CircleType = 1L << 2, // ... 其他枚举值 ... PlanarFaceFeatureType = 1L << 16, AnotherFeatureType = 1L << 32, // 4294967296 MaxValue = 1L << 63 // 9223372036854775808 }
在简化的代码中,可以使用按位或操作符|
来创建一个掩码,并使用按位与操作符&
来检查多个枚举成员
EnumShapeType shapeTypesToCheck = EnumShapeType.BoxType | EnumShapeType.SphereType | EnumShapeType.LineType | EnumShapeType.PointType | EnumShapeType.RectangleType; if ((enumShapeType & shapeTypesToCheck) != EnumShapeType.None) { // Your code here }
Contains
方法简化另外一种更直观和易于理解的方式(不使用[Flags]
特性),可以使用一个数组来存储需要检查的枚举成员,然后利用Contains
方法来简化代码
EnumShapeType[] validShapeTypes = { EnumShapeType.BoxType, EnumShapeType.SphereType, EnumShapeType.LineType, EnumShapeType.PointType, EnumShapeType.RectangleType }; if (validShapeTypes.Contains(enumShapeType)) { // Your code here }