梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 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