.NET框架中位标志的实际用途

10

我在研究如何使用flags属性和位运算符将枚举用作位标志(见下文)。

是否有任何.NET框架中使用这种模式的地方?我喜欢这个想法,但希望看到更多实际示例。

[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个回答

11

是的 - 可以看一下 MethodBase.Attributes,它会告诉你成员是公共的、静态的等等。

FileAccessFileOptions 也是基于文件的例子。

如果你打开反编译器(Reflector),找到 FlagsAttribute,然后按 "分析"(Ctrl-R)并展开 "使用者",你会看到许多类型正在使用它。不过这需要一段时间 :)


1
糟糕!我知道应该有一种方法可以在反射器中找到它,而不是手工编写一些代码。 - Damien_The_Unbeliever

5

2

它被广泛应用于各个领域,比如在.NET框架中用于文件属性,在安全标志中也可以看到其使用。

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 }

Checkbox (复选框) 主要用于具有多个属性的场景,比如颜色、种族等选择。

在 Windows 程序中,常见的使用场景是在对话框中,可以将多个 Checkbox 组合使用,例如在 MessageBox 中选择按钮时可使用“确定(Ok)”、“取消(Cancel)”、“忽略(Ignore)”等。


2
设置字体样式选项时怎么样,例如:
this.Font = new Font(this.Font, FontStyle.Bold | FontStyle.Italic);

2

2

mscorlib和System程序集中有很多例子,但在日常使用中会遇到多少则是一个更棘手的问题。

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

我实际上为了好玩而转储了System和mscorlib中的所有标志枚举,然后寻找有趣的内容:

    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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接