10

正在研究如何通过使用 flags 属性和 bitwize 运算符装饰枚举来将它们用作位标志(见下文)。

.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);
4

6 回答 6

11

是的 -MethodBase.Attributes例如,查看成员是否是公共的、静态的等。

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

如果您打开反射器,找到FlagsAttribute并点击“分析”(Ctrl-R)并展开“使用者”,您会看到大量使用它的类型。不过这需要一段时间:)

于 2010-08-10T12:24:05.343 回答
5

您将看到的最常见的 [Flags] 枚举之一是正则表达式选项枚举。这是一个例子:

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

于 2010-08-10T12:27:51.767 回答
2

在 BCL中有很多地方FlagsAttribute用于枚举。

这是一个示例 -BindingFlags反射代码中使用的参数。

于 2010-08-10T12:24:11.170 回答
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 }

它们基本上适用于您可以选择某物的可能属性的任何场景,如果您有一些可能是颜色选择或种族选择等的东西。

另一个常见的地方是 winforms 对话框具有由它们组成的属性,您可以将它们或它们一起用于消息框来决定您选择的按钮,如 Ok | 取消 | 忽略等。

于 2010-08-10T12:26:42.173 回答
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()
于 2010-08-10T12:33:48.217 回答
2

设置字体样式选项时怎么样,例如:

this.Font = new Font(this.Font, FontStyle.Bold | FontStyle.Italic);
于 2010-08-10T12:38:18.863 回答