4

请注意下面的简单示例:

Module Module1
    <Flags>
    Public Enum Names
        None    = 0
        Test    = 1
        Test2   = 2
        Test3   = 4
        Test4   = 8
    End Enum

    Sub Main()
        Dim test As Names = Names.Test Or Names.Test3
        If (test And Names.Test3) = Names.Test3
            Console.WriteLine("TRUE")
        Else
            Console.WriteLine("FALSE")
        End If
    End Sub
End Module

我的问题的第一部分与该行有关If (test And Names.Test3) = Names.Test3

If test And Names.Test3简单地检查标志是否存在不是更好吗?如果它评估为非零值(意味着存在标志),那么条件的结果将是True无论如何。

是否有充分的理由使用第一种方式检查第二种方式?(虽然我的答案是针对 VB.NET,但我也想知道这是否是其他任何地方的潜在陷阱,即 C#、C++ 等)。

此外,关于删除标志,似乎有两种方法可以做到这一点:

test = test Xor Names.Test3test = test And Not Names.Test3

但是,如果标志丢失,第一个将添加标志,如果存在则将其删除,而第二个只会将其删除。这是唯一的区别吗?或者还有其他原因为什么我应该更喜欢一种方法而不是另一种?

4

2 回答 2

5

你说你可以有效地替换它是正确的:

If (test And Names.Test3) = Names.Test3 Then

有了这个

If (test And Names.Test3) Then

但是,第二个示例将无法编译,Option Strict On因为您正确地得到了错误:

Option Strict On disallows implicit conversions from 'Names' to 'Boolean'所以为了让它编译你需要把它包CBool起来。

因此,总而言之,我会说使用第一个示例要好得多,因为意图非常明确:-您正在检查是否设置了位。

在删除标志方面,即取消设置你应该使用:

test = test And Not Names.Test3

使用Xor具有切换值的效果。

以下可能会有所帮助(特别是如果您将它们设为扩展方法):

Public Function SetBit(ByVal aValue As Names, ByVal aBit As Names) As Names
    Return (aValue Or aBit)
End Function

Public Function ClearBit(ByVal aValue As Names, ByVal aBit As Names) As Names
    Return (aValue And Not aBit)
End Function

Public Function IsBitSet(ByVal aValue As Names, ByVal aBit As Names) As Boolean
    Return ((aValue And aBit) = aBit)
End Function

Public Function ToggleBit(ByVal aValue As Names, ByVal aBit As Names) As Names
    Return (aValue Xor aBit)
End Function
于 2016-07-05T11:06:32.080 回答
2

请记住,Flags枚举不必都是纯粹的单个位值。例如想象(用更好的名字)你的枚举是:

<Flags>
Public Enum Names
    None    = 0
    Test    = 1
    Test2   = 2
    Test3   = 4
    Test4   = 8
    Test2AndTest4 = 10
End Enum

现在,您不想只测试test And Names.Test2AndTest4非零值,因为它不能回答正确的问题。因此,一般来说,进入And掩码以检查然后与掩码值进行比较是一个更好的习惯,以确保设置了掩码的所有位。

于 2016-07-05T14:04:10.200 回答