枚举组合,正确的方式 - vb.net



我有一个项目在 Vb.net 和Windows表单应用程序与dotnet framework 3.5。我正在使用 Emum 来存储和处理任务,因为:

Public Enum TaskStatus
        none = 0
        completed = 2
        executing = 4
        executed = 8
        errors = 16      '' Means task got some error in performing some operations
        uploaded = 32
        incomplete = 64  '' Means Task Was Aborted or Process Stopped in between
End Enum

一个函数正在处理任务,另一个函数正在检查其完成状态,因为

Private Function Manage()
        Dim ts As TaskStatus = TaskStatus.none
        '' Performing Tasks 
        ts = TaskStatus.executing
        '' Task Performed with Error
        ts = TaskStatus.errors Or TaskStatus.executed
        '' Task Uploading
        ts = ts Or TaskStatus.uploaded
        ts = ts Or TaskStatus.completed
        ts = TaskStatus.none
        CheckStatus(ts)
End Function
 Private Function CheckStatus(ByVal ts As TaskStatus)
    ' Now i Want to check
    If ts And (TaskStatus.uploaded Or TaskStatus.errors) Then
        '' Which one of these(Below) is Correct
    End If
    If ts = (TaskStatus.uploaded Or TaskStatus.errors) Then
        '' Which one of these(Above one) is Correct
    End If
    If ts And TaskStatus.incomplete Then
        '' Is it Correct way to check for incompletion
    End If
    If ts And TaskStatus.completed Then
        '' Task is Completed
        '' Is is correct way to check Task Completed
    End If
End Function

在函数检查状态中,我想知道使用enum组合进行操作的正确方法?

这是一个可能对一些想法有所帮助的课程。 请注意枚举值 all 和枚举上的 flags 属性。

Public Class StatusTask
    <Flags> _
    Public Enum TaskStatus
        none = 0
        completed = 2
        executing = 4
        executed = 8
        errors = 16      '' Means task got some error in performing some operations
        uploaded = 32
        incomplete = 64  '' Means Task Was Aborted or Process Stopped in between
        all = -1
    End Enum
    Public ThisStatus As TaskStatus = TaskStatus.none
    Public Sub SetStatus(aStatus As TaskStatus)
        Me.ThisStatus = aStatus
    End Sub
    Public Sub AddStatus(aStatus As TaskStatus)
        Me.ThisStatus = Me.ThisStatus Or aStatus
    End Sub
    Public Sub ClearStatus(aStatus As TaskStatus)
        Me.ThisStatus = Me.ThisStatus And (aStatus Xor TaskStatus.all)
    End Sub
    Public Function HasStatus(aStatus As TaskStatus) As Boolean
        ''if HasFlag not found use
        ''Return (Me.ThisStatus And aStatus) = aStatus
        Return Me.ThisStatus.HasFlag(aStatus)
    End Function
End Class

和一些用法

    Dim foo As New StatusTask
    'set some status
    foo.SetStatus(StatusTask.TaskStatus.completed)
    foo.AddStatus(StatusTask.TaskStatus.executed)
    foo.AddStatus(StatusTask.TaskStatus.incomplete Or StatusTask.TaskStatus.uploaded)
    Debug.WriteLine(foo.ThisStatus)
    'do some checks
    'single
    If foo.HasStatus(StatusTask.TaskStatus.completed) Then
        Stop
    End If
    'multiple(both must be set)
    If foo.HasStatus(StatusTask.TaskStatus.completed) AndAlso foo.HasStatus(StatusTask.TaskStatus.incomplete) Then
        Stop
    End If
    'multiple(both must be set) alternative
    If foo.HasStatus(StatusTask.TaskStatus.completed Or StatusTask.TaskStatus.executed) Then
        Stop
    End If
    'multiple(either set)
    If foo.HasStatus(StatusTask.TaskStatus.errors) OrElse foo.HasStatus(StatusTask.TaskStatus.incomplete) Then
        Stop
    End If
    'clear status
    foo.ClearStatus(StatusTask.TaskStatus.errors) 'errors not set
    Debug.WriteLine(foo.ThisStatus)
    foo.ClearStatus(StatusTask.TaskStatus.completed Or StatusTask.TaskStatus.uploaded)
    Debug.WriteLine(foo.ThisStatus)
    foo.ClearStatus(StatusTask.TaskStatus.incomplete)
    Debug.WriteLine(foo.ThisStatus)
    foo.ClearStatus(StatusTask.TaskStatus.all)
    Debug.WriteLine(foo.ThisStatus)

我会说你在这里所做的是完全可以做到的,但是如果你想检查哪些是正确的,你正在使用or,我建议将它们分成不同的if语句。

除此之外,我还建议使用elseif而不是正常的if语句,只是为了保护一些时间和资源:)

以下是我将如何做到这一点:

Private Function CheckStatus(ByVal ts As TaskStatus)
' Now i Want to check
If ts = TaskStatus.uploaded Then
    'Uploaded
Elseif ts = TaskStatus.errors Then
    'Error
Elseif ts = TaskStatus.incomplete Then
    'Incomplete
Elseif ts = TaskStatus.completed Then
    ' Task is Completed
End If
End Function

这只是我如何做到这一点的快速草图,但如果我误读了什么,请告诉我。

最新更新