C# 中的 [Flags] 枚举属性:理解其作用
在 C# 中定义枚举时,如果枚举表示的是值的集合而非单个值,则可以使用 [Flags] 属性。此属性在使用按位运算符的枚举中特别有用。
[Flags] 属性的重要性
与普遍的误解相反,[Flags] 属性仅仅通过 .ToString()
方法提供更易读的表示形式。使用 [Flags] 标记的枚举将输出其值,值以逗号分隔的标志名称列表形式显示,如下所示:
<code class="language-csharp">enum Suits { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 } [Flags] enum SuitsFlags { Spades = 1, Clubs = 2, Diamonds = 4, Hearts = 8 } ... var str1 = (Suits.Spades | Suits.Diamonds).ToString(); // "5" var str2 = (SuitsFlags.Spades | SuitsFlags.Diamonds).ToString(); // "Spades, Diamonds"</code>
2 的幂值
必须强调的是,[Flags] 属性不会自动将 2 的幂值赋给枚举。如果跳过数值赋值,则按位运算中的枚举行为将不正确,因为默认值从 0 开始递增。
正确的声明:
<code class="language-csharp">[Flags] public enum MyColors { Yellow = 1, Green = 2, Red = 4, Blue = 8 }</code>
获取不同的值:
要检索枚举属性中的不同值,可以使用多种方法:
使用 .HasFlag()
(.NET 4 及更高版本可用):
<code class="language-csharp"> if (myProperties.AllowedColors.HasFlag(MyColor.Yellow)) { // Yellow is allowed... }</code>
使用按位运算符(.NET 4 之前):
<code class="language-csharp"> if ((myProperties.AllowedColors & MyColor.Yellow) == MyColor.Yellow) { // Yellow is allowed... }</code>
底层机制
[Flags] 属性允许通过按位运算符操作二进制值。通过将 2 的幂值作为枚举值,值的底层二进制表示允许进行高效且有意义的按位运算。
例如,如果属性 AllowedColors 使用二进制按位或 | 运算符赋值为 Red、Green 和 Blue,则 AllowedColors 将保存二进制值 00001110。
None = 0 值
在某些枚举中,包含 0 值(通常命名为“None”)。但是,需要注意的是,涉及 None 值的按位与 & 运算始终返回 0,因此不适合用于测试特定标志。可以改用逻辑比较。
有关 [Flags] 属性、其用法和设计模式的更多信息和资源,请参阅 MSDN 文档。
以上是c#[flags]枚举如何增强位置操作和枚举可读性?的详细内容。更多信息请关注PHP中文网其他相关文章!