代码之家  ›  专栏  ›  技术社区  ›  AJM

位标志在.NET framework中的实际使用

  •  10
  • AJM  · 技术社区  · 15 年前

    Was正在研究如何使用flags属性和bitwize操作符将枚举作为位标志(见下文)。

    [Flags]
    enum Days2 : int
    {
    
      None = 0x0,
      Sunday = 0x1,
      Monday = 0x2,
      Tuesday = 0x4,
      Wednesday = 0x8,
      Thursday = 0x10,
      Friday = 0x20,
      Saturday = 0x40
    }
    
      Days2 meetingDays = Days2.Tuesday | Days2.Thursday;
    
      // Set an additional flag using bitwise OR.
      meetingDays = meetingDays | Days2.Friday;
    
      Console.WriteLine("Meeting days are {0}", meetingDays);
    
    6 回复  |  直到 15 年前
        1
  •  11
  •   Jon Skeet    15 年前

    是的-看看 MethodBase.Attributes

    FileAccess FileOptions 也是基于文件的示例。

    如果你打开反射器,找到 FlagsAttribute 然后点击“Analyze”(Ctrl-R)并展开“used by”,您将看到大量使用它的类型。不过,这需要一段时间:)

        2
  •  5
  •   jwsample    15 年前

    您将看到的最常见的[Flags]枚举之一是regex options枚举。举个例子:

    Regex rxInsensitive = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b",
              RegexOptions.Compiled | RegexOptions.IgnoreCase);
    

    更多信息: http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx

    几年前,我写了一篇关于在.Net中使用位枚举的教程,也许这会有所帮助: http://www.johnsample.com/articles/BitwiseEnums.aspx

        3
  •  2
  •   Oded    15 年前

    FlagsAttribute 用于BCL中的枚举。

    这里有一个例子- BindingFlags 反射代码中使用的参数。

        4
  •  2
  •   Jimmy Hoffa    15 年前

    它有很多地方被使用,它在.NETFramework的文件属性中被使用,我看到它被用作安全标志。

    enum Roles
    {
        None = 0,
        User = 1,
        Admin = 2,
        Superman = 4
    }
    
    if (_user.Roles & Roles.Admin != Roles.None) { user-is-admin }
    if (_user.Roles & Roles.Superman != Roles.None) { user-is-also-superman }
    

    另一个常见的地方是winforms对话框有由它们组成的属性,你可以把它们放在一个messagebox中,决定按钮的选择,比如Ok | Cancel | Ignore等。

        5
  •  2
  •   Damien_The_Unbeliever    15 年前

    在mscorlib和系统程序集中有很多例子,尽管在日常使用中会遇到多少是一个比较棘手的问题。

    例如,System.Threading.ThreadState 是当前线程状态和挂起请求的组合。

        Dim types = (From t In Reflection.Assembly.GetAssembly(GetType(Int32)).GetTypes() Select t).Concat( _
                    (From t In Reflection.Assembly.GetAssembly(GetType(Uri)).GetTypes() Select t))
    
        For Each t As Type In types
            If t.IsEnum AndAlso (From att In t.GetCustomAttributes(True) Where TypeOf (att) Is FlagsAttribute).Any() Then
                Console.WriteLine("Flag Enum: {0}", t.ToString())
            End If
        Next
        Console.ReadLine()
    
        6
  •  2
  •   PaulG    15 年前

    设置时如何 font style 选项,例如:

    this.Font = new Font(this.Font, FontStyle.Bold | FontStyle.Italic);
    
    推荐文章