嗔秤戻幣�哉膵�云利匈嬉蝕湊蛸賜�塋床四衲���萩晦編報炎嘔囚^泡仟 ̄云利匈�《超噌�殻窟�嵌虜隆輓麈觚翹瀘卉韮�仍仍�。� 烏御危列
浪慕利 卦指云慕朕村 厘議慕尺 厘議慕禰 TXT畠云和墮 序秘慕杏 紗秘慕禰

VB2008貫秘壇欺娼宥(PDF鯉塀哂猟井)-及87嫗

梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 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
卦指朕村 貧匯匈 和匯匈 指欺競何 壘��0�� 家��0��
隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
梁椣戻幣�� 梁心弌傍議揖扮窟燕得胎��傍竃徭失議心隈才凪万弌誌育断蛍�輌臆惨軼僑〃�燕慕得珊辛參資誼持蛍才将刮襲潜��範寔亟圻幹慕得 瓜寡追葎娼得辛參資誼寄楚署衛、持蛍才将刮襲潜填��