[英]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(已完成+错误)。 它仍然是完整的,并且有错误。
如果您的程序不适用于此逻辑,则说明您在错误使用状态位。
也
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 +任何或所有其他位(除了all
和none
也是为什么)我删除了那些)。 完整和不完整的状态是不确定的,那么为什么要浪费一点呢?
执行和执行提供了类似的难题,因为并非所有组合都有意义,例如执行+已执行,即它仍在执行但已完成执行。 但是这些状态的其他组合是有意义的。 看这个:
|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.