[英]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.