梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
implementations must match this signature ��in our case�察�ProcessMaximumValue�┌� and
ProcessRunningTotal�┌� match the delegate signature���此�
Delegate Sub ProcessValue��ByVal value As Integer��
The declaration of the delegate is outside the scope of a class or interface�察�but the usage of
a delegate must be in the context of a class ��as it is in our case��。
The type of the delegate is the name of the method�察�which is ProcessValue in our case。 The
delegate will be used in the code example to provide a general callback mechanism in the iterator。
The iterator is declared as follows�此�
´´´´´´´´´´´´´´´´´´´´´´Page 263´´´´´´´´´´´´´´´´´´´´´´´
C HA P TE R 9 * L E AR N I N G A B O U T L I ST S�察 �DE L E G AT E S �察 �AN D L A M B D A E X PR E SSI O N S 241
Module Extensions
Public Sub Iterate��ByVal collection As ICollection��Of Integer���察�_
ByVal cb As ProcessValue��
Dim element As Integer
For Each element In collection
cb��element��
Next
End Sub
End Module
A module method can be called as follows�此�
Iterator。Iterate��lst�察�delegate��
The first parameter of the Iterate�┌� method is the list to iterate�察�and the second parameter
is a delegate instance that matches the method signature of the ProcessValue delegate。
In the implementation of Iterate�┌��察�each element of the collection is iterated using For
Each�察�and then in the loop�察�the variable cb is called as if it were a method。 The calling of cb is
what separates the iterator from the processing of the iteration。 Imagine having implemented
a method that calculates the running total or maximum。 To iterate all of the elements�察�you
would instantiate the delegate with the method and call Iterate�┌��察�as follows�此�
Iterator。Iterate��lst�察�New ProcessValue��ProcessRunningTotal����
。 。 。
Iterator。Iterate��lst�察�New ProcessValue��ProcessMaximumValue����
The code that wants to automatically iterate code must provide only a delegate imple
mentation。
Implementing Methods That Match the Delegate
Implementing methods that match a delegate is straightforward in that you need to declare
only a method in a class that has the same method signature。 This can be implemented using
a shared method or an instance method�察�it does not matter。 The following code demonstrates
methods that match the ProcessValue delegate¨s signature using both types of methods。
Class DelegateImplementations
Private Sub InstanceProcess��ByVal value As Integer��
End Sub
Private Shared Sub SharedProcess��ByVal value As Integer��
End Sub
End Class
In the example�察�the InstanceProcess�┌� and SharedProcess�┌� methods match the signature
of the delegate ProcessValue。 If you have two delegates with identical parameter and return
type signatures�察�then a method with the same signature can be used for either delegate definition。
The following shows how to have the methods be recognized as a delegate。
´´´´´´´´´´´´´´´´´´´´´´Page 264´´´´´´´´´´´´´´´´´´´´´´´
242 CH AP T E R 9 * L E A R N IN G AB OU T L I ST S�察 �D E L E G A T E S�察 �A N D L A M B DA E X P R E S SI ON S
Dim instanceMethod As New ProcessValue��AddressOf InstanceProcess��
Dim sharedMethod As New ProcessValue��AddressOf SharedProcess��
These two lines instantiate the delegate using the New keyword�察�and each instantiation has
a single constructor parameter�察�which is the method to associate with the delegate instance。
Now let¨s look at the running total and maximum value example and see the methods that
will be wrapped up by delegates。
Module Tests
Private _maxValue As Integer
Private _runningTotal As Integer
Private Sub ProcessMaximumValue��ByVal value As Integer��
If ��value 〃 Tests。_maxValue�� Then
_maxValue = value
End If
End Sub
Private Sub ProcessRunningTotal��ByVal value As Integer��
_runningTotal = _runningTotal �� value
End Sub
End Module
The ProcessMaximumValue�┌� and ProcessRunningTotal�┌� methods both have the same
signatures as ProcessValue�察�and therefore are delegate candidates。 In each delegate implemen
tation�察�the running total is calculated or the maximum value is found。 The following code uses
the delegates。
Public Sub RunAll�┌�
Dim lst As New List��Of Integer���┌�
lst。Add��1��
lst。Add��2��
lst。Add��3��
lst。Add��4��
_runningTotal = 0
Iterator。Iterate��lst�察�New ProcessValue��AddressOf ProcessRunningTotal����
Console。WriteLine�┌─�Running total is �──�& _runningTotal & ;��;����
_maxValue = Integer。MinValue
Iterator。Iterate��lst�察�New ProcessValue��AddressOf ProcessMaximumValue����
Console。WriteLine�┌─�Maximum value is �──�& _maxValue & ;��;����
End Sub
In the example�察�the RunAll�┌� method instantiates and assigns lst。 Then to iterate the indi
vidual elements�察�the Iterator。Iterate�┌� method is called with lst and the
ProcessRunningTotal�┌� method。 After having calculated and presented the running total�察�the
maximum value is calculated and displayed。
´´´´´´´´´´´´´´´´´´´´´´Page 265´´´´´´´´´´´´´´´´´´´´´´´
C HA P TE R 9 * L E AR N I N G A B O U T L I ST S�察 �DE L E G AT E S �察 �AN D L A M B D A E X PR E SSI O N S 243
The delegate solution is more pact than the previous abstract base class solution。 The
big advantage is the ability to solve a problem using a smaller�察�piecemeal approach。 It is not
hard to implement a delegate�察�and it is not hard to use a delegate。
Understanding Lambda Expressions
Lambda expressions are an extension of delegates�察�but solve a specific problem。 Let¨s take the
example of calculating sales tax。 Sales tax in general is a simple calculation in that you take the
total amount�察�multiply it by the sales tax�察�and add the result to the amount。 This gives you the
total a customer must pay。 Calculating a sales tax is not difficult�察�but it is something that would
be nice to encapsulate into a small piece of functionality。 Thus�察�calculating sales tax is an excel
lent use of lambda expressions。
A lambda expression is declared as a Function that has a single expression as a body。 Following
is the declaration of a lambda expression。
Dim calculate = Function��tax As Double�察�amount As Double�� ��tax * amount�� �� amount
The lambda expression is declared as a function without a return type。 The code after the
brackets is a single expression that uses the parameters to perform some action。 In the example�察 �
that single expression is the calculation of the sales tax that is added to the amount to generate
a new total。
The lambda expression could be used as follows�此�
Console。WriteLine�─�Tax �──�& calculate��0。1�察�100�� & ;��;��
The calculate lambda expression is called with two numbers that are of type Double�察�which
generates an expression similar to this�此�
Function sdfsdfsdf��tax As Double�察�amount As Double�� As Double
Return ��tax * amount�� �� amount
End Function
Notice a return type of Double is declared in the generated code。 The pile