Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
枚举组合-vb.net_.net_Vb.net_Enums - Fatal编程技术网

枚举组合-vb.net

枚举组合-vb.net,.net,vb.net,enums,.net,Vb.net,Enums,我有一个项目在Vb.net和windows窗体应用程序与dotnet框架3.5。我使用Enum存储和处理任务,如下所示: Public Enum TaskStatus none = 0 completed = 2 executing = 4 executed = 8 errors = 16 uploaded = 32 incomplete = 64 all =-1 End Enum Private Function

我有一个项目在Vb.net和windows窗体应用程序与dotnet框架3.5。我使用Enum存储和处理任务,如下所示:

Public Enum TaskStatus
    none = 0
    completed = 2
    executing = 4
    executed = 8
    errors = 16      
    uploaded = 32
    incomplete = 64  
    all =-1
End Enum

Private Function Manage()
    Dim ts As TaskStatus = TaskStatus.none
    '' Task Performed with Error
    ts = TaskStatus.errors Or TaskStatus.executed
    '' Task Uploading
    ts = ts Or TaskStatus.uploaded
    ts = ts Or TaskStatus.completed
    CheckStatus(ts)
End Function

Private Function CheckStatus(ByVal ts As TaskStatus)
    '' Now i have to check for two or More Enums
    '' ts have current values := Error , Executed, Uploaded , Completed

    If ts = (TaskStatus.uploaded Or TaskStatus.errors) Then
        '' It is not working
    End If
    If ts = (TaskStatus.executed Or TaskStatus.uploaded Or TaskStatus.completed) Then
        '' It is not working
    End If
    If ts And (TaskStatus.uploaded Or TaskStatus.executed) Then
       '' Working, But Not Sure is it correct way ?
    End If
    If (ts And TaskStatus.completed) = TaskStatus.completed Then
        '' Completed 
    End If
End Function
由于ts具有当前值:=错误或已执行、上载或已完成。
由于框架3.5的原因,我无法使用
hassflag


如何比较枚举中是否包含两个或多个特定值,如代码中所述?

在忽略任何其他标志的同时检查两个标志,例如:

If (ts And (TaskStatus.uploaded Or TaskStatus.errors)) =
        (TaskStatus.uploaded Or TaskStatus.errors) Then
    ' ...
End If
这很难看。助手方法会让事情变得更好:

Function HasFlags(value As TaskStatus, flags As TaskStatus) As Boolean
    Return (value And flags) = flags
End Function

If HasFlags(ts, TaskStatus.uploaded Or TaskStatus.errors) Then
    ' ...
End If

您可以传入您想要检查的任意多个标志。

如果
completed
位为高位,则它已完成。其他哪些位高并不重要

您可以在有错误的情况下完成,并且值为18(已完成+错误)。它仍然是完整的,并且完成时有错误

如果您的程序不能使用此逻辑,则说明您使用的状态位不正确

  • 我不明白你为什么要跳过枚举中的1
  • -1表示
    all
    是愚蠢的,因为all应该是所有枚举值的总和
如果您这样定义了枚举

Public Enum TaskStatus
    completed = 1
    executing = 2
    executed = 4
    errors = 8     
    uploaded = 16
End Enum
  • 全部
    现在将为31
  • Complete
    TaskStatus时为。Complete
    位为0
下面是如何更好地设计它和一个有效的使用示例

Public Enum TaskStatus
    completed = 1
    executing = 2
    executed = 4
    errors = 8
    uploaded = 16
End Enum

Sub Main()
    CheckStatus(TaskStatus.executing + TaskStatus.uploaded)
    CheckStatus(TaskStatus.completed + TaskStatus.errors)
    CheckStatus(TaskStatus.completed)
    CheckStatus(TaskStatus.completed + TaskStatus.executing + TaskStatus.executed + TaskStatus.errors + TaskStatus.uploaded)
    Console.ReadLine()
End Sub

Private Sub CheckStatus(ByVal ts As TaskStatus)
    Console.WriteLine("TaskStatus value: {0}", ts)
    If ts And TaskStatus.completed Then
        If ts And TaskStatus.errors Then
            Console.WriteLine("completed with errors")
        Else
            Console.WriteLine("completed without errors")
        End If
    Else
        Console.WriteLine("not completed")
        If ts And TaskStatus.executing Then
            Console.WriteLine("still executing")
            If ts And TaskStatus.uploaded Then
                Console.WriteLine("finished uploading")
            Else
                Console.WriteLine("still uploading")
            End If
        End If
    End If
    If ts = 31 Then
        Console.WriteLine("you set all the status bits!")
    End If
    Console.WriteLine()
End Sub
带有测试程序的输出:

任务状态值:18
未完成
仍在执行
已完成上载

任务状态值:9
完成时有错误

任务状态值:已完成
完整无误

任务状态值:31
完成时有错误
你设置了所有的状态位

想想为什么我删除了
不完整的
。每个位表示一个布尔逻辑状态,即它只能是一种方式或另一种方式。如果您有一个位表示completed和incomplete,那么您可能会有一个不合逻辑的状态,其中completed和incomplete都很高,在您的示例中,值为66+任何或所有其他位(除了
all
none
——这也是我删除它们的原因)。完全和不完全的状态是未定义的,那么为什么要浪费比特呢

执行和已执行提供了一个类似的难题,因为并非所有的组合都有意义,例如Executing+executed,即它仍然在执行,但它已经完成了执行。但这些状态的其他组合是有意义的。看看这个:

|已执行:0 |已执行:1|
----------------------------------------------------------------------
正在执行:0 |当前未执行|已执行,已完成执行|
正在执行:1 |当前正在执行|已执行,仍在执行|

如果你修改了程序的逻辑,你会发现你不需要两个位。这只是其他地方存在问题的一个迹象。

您当然可以编写自己的
hassflag
方法来简化代码。状态枚举相当奇怪——它似乎是状态和结果的组合。看起来应该是两个(为了清晰和易于使用),但不清楚您要检查什么。我相信您的前两个ifs会检查该值是否只设置了这些标志,这是不正确的。第三个if仅使用
选项Strict Off
编译,因为您试图将枚举值视为布尔值。第四个if检查是否在不考虑其他标志的情况下设置了完成标志。如果您还没有枚举,您可能应该将其添加到枚举中,尽管我认为这不会改变比较的工作方式。可能会重复不同的概念,这只是比较变量中的单个枚举值。“如果枚举中包含两个或多个特定值”@ProgramAdmin实际上需要代码,这是您以前问过的问题。James Thorpe的答案向您展示了如何检查是否设置了两个或多个标志。