首页 > 后端开发 > C++ > c#[flags]枚举如何增强位置操作和枚举可读性?

c#[flags]枚举如何增强位置操作和枚举可读性?

Barbara Streisand
发布: 2025-02-02 14:56:10
原创
424 人浏览过

How Does the C# [Flags] Enum Attribute Enhance Bitwise Operations and Enumeration Readability?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板