按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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