簡體   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