繁体   English   中英

枚举组合-vb.net

[英]enum combination - vb.net

我在Vb.net中有一个项目,并在Windows窗体应用程序中使用了dotnet framework 3.5。 我正在使用枚举存储和处理任务,如:

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,我无法使用HasFlag

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

在忽略其他任何标志的情况下检查两个标志,可能类似于:

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
  • 现在all将是31
  • TaskStatus.Complete位为0时incomplete

这是如何更好地设计它以及有效的使用示例

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

输出与测试程序:

TaskStatus值:18
没完成
仍在执行
上传完毕

TaskStatus值:9
错误完成

TaskStatus值:已完成
完成没有错误

TaskStatus值:31
错误完成
您设置所有状态位!

想一想为什么我删除了incomplete 每一位代表一个布尔逻辑状态,即它只能是一种方式。 如果您有一点要完成和不完整,那么您可能会处于不合逻辑的状态,其中完成和不完整都很高,示例中值为66 +任何或所有其他位(除了allnone也是为什么)我删除了那些)。 完整和不完整的状态是不确定的,那么为什么要浪费一点呢?

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

             |executed: 0             |executed: 1                   |
----------------------------------------------------------------------
executing: 0 |not currently executing |executed, finished executing  |
executing: 1 |currently executing     |executed, still executing ??? |

如果您修改了程序的逻辑,则会发现您不需要这两位。 这仅表明其他地方存在问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM