有的时候可能会写出形如这样的代码:
Public Class Class1
Enum CommandType
A
B
C
End Enum
Private _blahblah, _blbhblbh, _blchblch
Public Sub process(xxx As CommandType)
Select Case xxx
Case CommandType.A
Me.xxx(Me._blahblah, Me._blbhblbh)
Case CommandType.B
Me.yyy(Me._blahblah, Me._blbhblbh, Me._blchblch)
Case CommandType.C
Me.zzz(Me._blahblah)
Case Else
Throw New Exception()
End Select
End Sub
Private Sub xxx(a, b)
'...
End Sub
Private Sub yyy(a, b, c)
'...
End Sub
Private Sub zzz(a)
'...
End Sub
End Class
这极其不优雅, 而且Select会查找一次或多次, 这简直无法容忍。
于是我们知道有数组(或者字典)和Action这种东西, 于是将代码变成了如下这个样子。
Public Class Class1
Enum CommandType
A
B
C
_max
End Enum
Private _blahblah, _blbhblbh, _blchblch
Public Shared Processors As Action(Of Class1)() = Nothing
Public Shared Sub InitProcessor()
If Processors IsNot Nothing Then
Return
End If
ReDim Processors(CommandType._max)
Processors(CommandType.A) =
Sub(_Me As Class1)
_Me.xxx(_Me._blahblah, _Me._blbhblbh)
End Sub
Processors(CommandType.B) =
Sub(_Me As Class1)
_Me.yyy(_Me._blahblah, _Me._blbhblbh, _Me._blchblch)
End Sub
Processors(CommandType.C) =
Sub(_Me As Class1)
_Me.zzz(_Me._blahblah)
End Sub
End Sub
Public Sub process(xxx As CommandType)
InitProcessor()
Dim SelectedProcessor As Action(Of Class1) = Processors(xxx)
If SelectedProcessor IsNot Nothing Then
SelectedProcessor(Me)
Else
Throw New Exception()
End If
End Sub
Private Sub xxx(a, b)
'...
End Sub
Private Sub yyy(a, b, c)
'...
End Sub
Private Sub zzz(a)
'...
End Sub
End Class
通过在Enum最后加了个_max可以获得该枚举的最大长度, 然后使用了Shared的Action数组来节约内存, 并且使用Action(Of Class1)提供lambda表达式里面对自己实例的引用。
数组一次定位, 于是比Select Case快一些。

发表评论