【问题标题】:Combining Enums组合枚举
【发布时间】:2008-09-12 08:42:07
【问题描述】:

有没有办法在 VB.net 中组合枚举?

【问题讨论】:

    标签: .net vb.net enums


    【解决方案1】:

    我相信你想要的是一个标志类型的枚举。

    您需要在枚举的顶部添加Flags属性,然后您可以将枚举与'Or'关键字组合起来。

    像这样:

    <Flags()> _
    Enum CombinationEnums As Integer
      HasButton = 1
      TitleBar = 2
      [ReadOnly] = 4
      ETC = 8
    End Enum
    

    注意:右边的数字总是两倍大(2 的幂) - 这是为了能够分隔已设置的各个标志。

    使用 Or 关键字组合所需的标志:

    Dim settings As CombinationEnums
    settings = CombinationEnums.TitleBar Or CombinationEnums.Readonly
    

    这会将 TitleBar 和 Readonly 设置为枚举

    检查已设置的内容:

    If (settings And CombinationEnums.TitleBar) = CombinationEnums.TitleBar Then
      Window.TitleBar = True
    End If
    

    【讨论】:

    • 很好的答案。如果不是很明显,(正如 Jonas Follesø 在他的回答中指出的那样) - 关键是使用 Enum 值的 2 次方(1、2、4、8、16 等)
    • 如果您使用的是 .NET 4,那么您可以使用 .HasFlag 方法使代码更易于阅读 - If settings.HasFlag(CombinationEnums.TitleBar) Then blah blah
    【解决方案2】:

    您可以使用 FlagsAttribute 来装饰 Enum,这样您就可以组合 Enum:

    <FlagsAttribute> _
    Public Enumeration SecurityRights
    None = 0
    Read = 1
    Write = 2
    Execute = 4
    

    然后像这样调用它们(UserPriviltes 类):

    Public Sub New ( _
        options As SecurityRights _
    )
    
    New UserPrivileges(SecurityRights.Read OR SecurityRights.Execute)
    

    它们有效地组合在一起(位数学),因此上述用户可以在一个花哨的 SecurityRights 变量中同时进行读取和执行。

    要检查用户是否有特权,您可以使用 AND(更按位数学)来检查用户枚举值和您要检查的枚举值:

    //Check to see if user has Write rights
    If (user.Privileges And SecurityRights.Write = SecurityRigths.Write) Then
        //Do something clever...
    Else
        //Tell user he can't write.
    End If
    

    HTH, 泰勒

    【讨论】:

    • @abatishchev 这不是我从文章中得到的。 Do name the zero value of flags enumerations None...the value must always mean all flags are cleared。它的意思是你不应该用零来表示一些额外的状态,而零表示没有状态(即“无”)。
    • -1。您通过设置不是 2 的幂的值破坏了 的使用。.Net 不会神奇地导致示例中的位模式“1”和“3”不冲突。
    • 我将“Write”更新为 2(从 3,错字)。 Read=1 不是问题。
    【解决方案3】:

    如果你开始使用 enum flags() 有一篇很好的文章 here

    【讨论】:

      【解决方案4】:

      如果我正确理解您的问题,您想组合不同的枚举类型。那么一个变量可以存储来自两个不同枚举之一的值吗?如果您询问存储组合一个枚举类型的两个不同值,您可以查看 Dave Arkell 的解释

      枚举只是带有一些语法糖的整数。因此,如果您确保没有重叠,您可以通过强制转换为 int 来组合它们。

      但它不会生成漂亮的代码。我大部分时间都尽量避免使用枚举。通常,如果您让枚举在您的代码中滋生,那么它们会产生重复的 case 语句和其他混乱的反模式只是时间问题。

      【讨论】:

        【解决方案5】:

        组合Enums的关键是确保该值是2的幂(1、2、4、8等),以便您可以对它们执行位操作(|=@987654323 @)。这些Enums 可以用Flags 属性标记。 Windows 窗体控件上的Anchor 属性就是此类控件的一个示例。如果它被标记为标志,Visual Studio 将允许您检查值,而不是在属性设计器的下拉列表中选择单个值。

        【讨论】:

        • 二的幂:不要忘记 1 = 2^0!
        • 为“none”提供 0 值也总是不错的。
        猜你喜欢
        • 1970-01-01
        • 2018-02-14
        • 2020-05-19
        • 2011-04-09
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多