按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
     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 used to initialize the state of a particular