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

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

梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��




           with a basket of three items。 These three items can be referenced using three indices ��0 = newyork�察 �

           1 = toronto�察�2 = losangeles��。 This solution creates a fixed´content basket。 

                Alternatively�察�you could create space in the basket and then manually fill the basket�察�as follows�此�



           ReDim montreal。Connections��2��  

           montreal。Connections��0�� = newyork 

           montreal。Connections��1�� = toronto 

           montreal。Connections��2�� = losangeles 



                The ReDim statement takes the array referenced by the data member Connections and real

           locates it to a new size。 That size could be larger or smaller than the current size。 In the example�察 �

           the size of the array is 2�察�which does not mean two elements�察�but rather that it is an array sized  

           from the index 0 to 2。  

                The ReDim statement actually performs a redimension of an array。 The example demon

           strates using it on an empty array�察�but you can also use it with an array that contains data�察�such  

           as to enlarge an array without losing the old data。 To keep the old data in a new array�察�you use  

           the Preserve keyword�察�as follows�此�



           ReDim Preserve montreal。Connections��2��  

           montreal。Connections��0�� = newyork 

           montreal。Connections��1�� = toronto 

           montreal。Connections��2�� = losangeles 



                However�察�be aware that if the ReDim statement causes an array to shrink�察�you can still lose  

           data!whatever elements are located above the array size are discarded。 To be safe�察�before  

           using ReDim�察�you might want to reference the array¨s  Length property to verify that you are not  

           shrinking the array and losing data。 


´´´´´´´´´´´´´´´´´´´´´´Page 115´´´´´´´´´´´´´´´´´´´´´´´

                       CH AP T E R   4   *    L E A R N I N G   A B OU T   D AT A  S TR U CT U R E S�察  �DE CI SI ON S�察  �A N D   L O OP S 93 



     Using either the fixed´content or ReDim approach�察�you allocate space for the array and assign  

the variables representing the cities to the individual elements of the array。 Since Connections  

is an array of value types�察�the connections within the connections are not set�察�as shown in  

Figure 4´10。 



Figure 4´10。  The problem of the missing connections for New York 



     The problem is that the Connections array for New York is missing。 Of course�察�you could be  

logical and say it is missing because the Connections data member for New York has not yet  

been defined。 But�察�and it is a big but�察�think about how data is referenced and think about the  

behavior summarized in Table 4´1。 

      Node is a value type�察�and when a value type is assigned�察�the values within the type are copied。  

Because the connections for New York have not been assigned�察�the Montreal Connections array  

will not contain any connections from New York。 And if you modify the original variable for  

New York and its connections�察�those changes will not be reflected in the array of connections  

that Montreal has。 

     At this point�察�you might think this is not a problem�察�but consider the following New York code�此�



ReDim newyork。Connections��2��  

newyork。Connections��0�� = montreal 

newyork。Connections��1�� = houston 

newyork。Connections��2�� = miami 



     In this example�察�New York has a connection to Montreal�察�and Montreal has a connection  

to New York�察�pleting a full circle。 muters would want this ability to fly back and forth  

between cities。 But because we are using value types�察�it is not possible to fly back and forth�察�as  

illustrated by Figure 4´11。 

     Figure 4´11 illustrates that recursion with value types does not work。 It shows that there  

are connections from New York to Montreal。 But following the connection to Montreal�察�it would  

appear that New York has no connections�察�which is blatantly false�察�because we can see the  

connection from New York to Montreal。 


´´´´´´´´´´´´´´´´´´´´´´Page 116´´´´´´´´´´´´´´´´´´´´´´´

94        CH AP T E R   4   *    L E A R N IN G   AB OU T   D AT A  S TR U CT U R E S�察  �DE CI SI ON S�察  �A N D   L O OP S 



           Figure 4´11。 Missing connections for New York 



                When value types are assigned�察�you are copying contents of the value type and thus getting  

           a snapshot of the state of an object at some period in time。 In essence�察�the code illustrates the  

           chicken´and´egg problem of defining the connections for a particular city and then assigning  

           them。 For value types�察�how can you assign the connection of one city to another when the to

           be´assigned connection does not exist�拭�The short answer is you can¨t。 The long answer is you  

           can�察�but it would mean executing an infinite loop�察�which is of no use to us�察�because we want to  

           do something with the data once it has been assigned。 



           Switching to a Class to Define a Node 



           To fix the chicken´and´egg problem�察�we need to use reference types instead of value types。 This  

           means we need to change the declaration of Node from a  Structure to a Class�察�as follows�此�



           Public Class Node  

             Public Shared RootNodes As Node�┌� 

             Public CityName As String 

             Public X As Double 

             Public Y As Double 

             Public Connections As Node�┌� 


´´´´´´´´´´´´´´´´´´´´´´Page 117´´´´´´´´´´´´´´´´´´´´´´´

                          CH AP T E R   4   *    L E A R N I N G   A B OU T   D AT A  S TR U CT U R E S�察  �DE CI SI ON S�察  �A N D   L O OP S 95 



    Public Sub New��ByVal city As String�察�ByVal X As Double�察�ByVal Y As Double��  

        Me。CityName = city 

        Me。X = X 

        Me。Y = Y 

        Me。Connections = Nothing 

    End Sub 

End Class 



      The change is a one´liner。 After the switch�察�if we executed the same assignment code as in  

the previous section when Node was a value type�察�the data structure shown in Figure 4´12 would  

be created。 



Figure 4´12。 A valid state for the New York Node instance 



      Looking at the node structure in Figure 4´12�察�you can see that New York points to Montreal  

and back again。 The infinite connection does not mean that you are using infinite resources。  

Instead�察�it means one reference is being set to another�察�as illustrated in Figure 4´13。 



    Variable montreal points to heap 

    memory that contains the data for 

                                              There is a reference in newyork to 

            the city Montreal 

                                                   montreal and vice versa 



               montreal                                                newyork 



  Public CityName As String                              Public CityName As String 

  Public X As Double                                     Public X As Double 

  Public Y As Double                                     Public Y As Double 

  Public Connections As Node�┌�                           Public Connections As Node�┌� 



                        newyork                                               montreal 



                    Array element is a reference to 

                        the other heap memory 



Figure 4´13。 Recursive assignment that seems like infinite resources 


´´´´´´´´´´´´´´´´´´´´´´Page 118´´´´´´´´´´´´´´´´´´´´´´´

96        CH AP T E R   4   *    L E A R N IN G   AB OU T   D AT A  S TR U CT U R E S�察  �DE CI SI ON S�察  �A N D   L O OP S 



                The apparent infinite resources are the cross´reference recursive assignment of two pieces  

           of heap memory。 It is fine to do this�察�and this ability is one of the reasons why people prefer  

           using reference types to value types。 



           Understanding Static Data Members and Methods 



           You¨ve seen how a constructor can be us
卦指朕村 貧匯匈 和匯匈 指欺競何 壘��0�� 家��0��
隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
梁椣戻幣�� 梁心弌傍議揖扮窟燕得胎��傍竃徭失議心隈才凪万弌誌育断蛍�輌臆惨軼僑〃�燕慕得珊辛參資誼持蛍才将刮襲潜��範寔亟圻幹慕得 瓜寡追葎娼得辛參資誼寄楚署衛、持蛍才将刮襲潜填��