VB2008´ÓÈëÃŵ½¾«Í¨(PDF¸ñʽӢÎÄ°æ)-µÚ27²¿·Ö
°´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·ҳ£¬°´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ£¬°´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿£¡
¡ª¡ª¡ª¡ªÎ´ÔĶÁÍꣿ¼ÓÈëÊéÇ©ÒѱãÏ´μÌÐøÔĶÁ£¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡an¡¡allocation¡¡of¡¡the¡¡embedded¡¡custom¡¡type¡£¡¡In¡¡the¡¡test¡¡code£»¡¡the¡¡allocation¡¡of¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡MyValueTypeWithReferenceType¡¡is¡¡the¡¡same¡¡as¡¡the¡¡previous¡¡code¡¡examples£»¡¡but¡¡a¡¡second¡¡allocation¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡of¡¡MyReferenceType¡¡is¡¡required¡¡because¡¡MyReferenceType¡¡is¡¡a¡¡reference¡¡type¡£¡¡Had¡¡MyReferenceType¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡been¡¡a¡¡value¡¡type£»¡¡the¡¡allocation¡¡would¡¡not¡¡have¡¡been¡¡necessary¡£¡¡But¡¡if¡¡you¡¡allocate¡¡a¡¡value¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡type¡¡like¡¡a¡¡reference¡¡type£»¡¡the¡¡piler¡¡will¡¡ignore¡¡the¡¡directive¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡107¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡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¡¡85¡¡
¡¡¡¡¡¡¡¡¡¡Running¡¡the¡¡test¡¡code¡¡results¡¡in¡¡the¡¡following£º¡¡
var¡¡value=0¡¡copiedVar¡¡value=0¡¡
var¡¡value=10¡¡copiedVar¡¡value=10¡¡
¡¡¡¡¡¡¡¡¡¡When¡¡you¡¡assign¡¡and¡¡modify¡¡an¡¡embedded¡¡reference¡¡type£»¡¡the¡¡reference¡¡type¡¡instance¡¡is¡¡¡¡
modified¡¡for¡¡both¡¡variables¡£¡¡In¡¡this¡¡case£»¡¡when¡¡we¡¡assigned¡¡the¡¡value¡¡type£»¡¡the¡¡contents¡¡were¡¡¡¡
copied£»¡¡including¡¡the¡¡pointer¡¡to¡¡the¡¡reference¡¡type¡£¡¡
¡¡¡¡¡¡¡¡¡¡Table¡¡4¡1¡¡summarizes¡¡the¡¡behavior¡¡of¡¡types¡¡when¡¡the¡¡allocated¡¡variable¡¡is¡¡assigned¡¡to¡¡¡¡
another¡¡variable¡¡and¡¡the¡¡data¡¡member¡¡from¡¡the¡¡original¡¡is¡¡modified¡£¡¡For¡¡example£»¡¡if¡¡the¡¡code¡¡¡¡
is¡¡custom2¡¡=¡¡custom1¡¡custom1¡£member¡¡=¡¡£§new¡¡value£§£»¡¡what¡¯s¡¡the¡¡value¡¡of¡¡custom2¡£member£¿¡¡¡¡
Table¡¡4¡1¡£¡¡Behavior¡¡When¡¡the¡¡Allocated¡¡Variable¡¡Is¡¡Assigned¡¡to¡¡Another¡¡Variable¡¡and¡¡the¡¡Data¡¡¡¡
Member¡¡from¡¡the¡¡Original¡¡Is¡¡Modified¡¡
Type¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Behavior¡¡
Value¡¡type¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Assigned¡¡data¡¡member¡¡is¡¡not¡¡modified¡¡
Reference¡¡type¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Assigned¡¡data¡¡member¡¡is¡¡modified¡¡
Value¡¡type¡¡embedding¡¡value¡¡type¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Assigned¡¡embedded¡¡data¡¡member¡¡is¡¡not¡¡modified¡¡
Value¡¡type¡¡embedding¡¡reference¡¡type¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Assigned¡¡embedded¡¡data¡¡member¡¡is¡¡modified¡¡
Reference¡¡type¡¡embedding¡¡value¡¡type¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Assigned¡¡embedded¡¡data¡¡member¡¡is¡¡modified¡¡
Reference¡¡type¡¡embedding¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Assigned¡¡embedded¡¡data¡¡member¡¡is¡¡modified¡¡
reference¡¡type¡¡
Value¡¡Types¡¡and¡¡Parameters¡¡
Another¡¡value¡¡type¡¡constraint¡¡relates¡¡to¡¡how¡¡variables¡¡are¡¡stored¡¡and¡¡manipulated¡¡when¡¡they¡¡¡¡
are¡¡passed¡¡via¡¡a¡¡method¡£¡¡Suppose¡¡you¡¡create¡¡a¡¡method¡¡that¡¡has¡¡as¡¡parameters¡¡a¡¡value¡¡type¡¡and¡¡¡¡
a¡¡reference¡¡type¡£¡¡If¡¡in¡¡the¡¡method¡¡the¡¡parameters¡¡are¡¡modified£»¡¡what¡¡modifications¡¡does¡¡the¡¡¡¡
caller¡¡of¡¡the¡¡method¡¡see£¿¡¡Consider¡¡the¡¡following¡¡code£º¡¡
Sub¡¡Method£¨ByVal¡¡value¡¡As¡¡MyValueType£»¡¡ByVal¡¡reference¡¡As¡¡MyReferenceType£©¡¡
¡¡¡¡value¡£value¡¡=¡¡10¡¡
¡¡¡¡reference¡£value¡¡=¡¡10¡¡
End¡¡Sub¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡caller¡¡can¡¡pass¡¡in¡¡instances¡¡of¡¡a¡¡value¡¡type¡¡and¡¡a¡¡reference¡¡type¡¡that¡¡are¡¡manipulated¡¡¡¡
in¡¡the¡¡context¡¡of¡¡the¡¡method¡£¡¡Now¡¡let¡¯s¡¡call¡¡Method£¨£©¡¡with¡¡the¡¡following¡¡code£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡108¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
86¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡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¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡value¡¡As¡¡MyValueType¡¡=¡¡New¡¡MyValueType£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡reference¡¡As¡¡MyReferenceType¡¡=¡¡New¡¡MyReferenceType£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Method£¨value£»¡¡reference£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Console¡£WriteLine£¨¡¨value¡¡value=¡¨¡¡&¡¡value¡£value¡¡&¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¨¡¡reference¡¡value=¡¨¡¡&¡¡reference¡£value£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡calling¡¡code¡¡instantiates¡¡the¡¡types¡¡MyValueType¡¡and¡¡MyReferenceType£»¡¡calls¡¡the¡¡method¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Method£¨£©£»¡¡and¡¡then¡¡inspects¡¡the¡¡value¡¡of¡¡the¡¡data¡¡member¡¡value¡¡from¡¡the¡¡value¡¡and¡¡reference¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡types¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Running¡¡the¡¡code¡¡will¡¡generate¡¡output¡¡similar¡¡to¡¡the¡¡following£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡value¡¡value=0¡¡reference¡¡value=10¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡executed¡¡code¡¡shows¡¡that¡¡the¡¡value¡¡type¡¡£¨MyValueType£©¡¡data¡¡member¡¡was¡¡not¡¡altered£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡whereas¡¡the¡¡reference¡¡type¡¡£¨MyReferenceType£©¡¡data¡¡member¡¡was¡¡altered¡£¡¡This¡¡is¡¡correct£»¡¡and¡¡it¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡demonstrates¡¡that¡¡when¡¡you¡¡call¡¡a¡¡method£»¡¡you¡¡are¡¡assigning¡¡the¡¡parameters¡¡of¡¡the¡¡method¡¡to¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡variables¡¡in¡¡the¡¡called¡¡method¡£¡¡Looking¡¡back¡¡at¡¡Table¡¡4¡1£»¡¡you¡¡can¡¡see¡¡that¡¡when¡¡you¡¡assign¡¡a¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡value¡¡to¡¡a¡¡value¡¡type£»¡¡manipulating¡¡the¡¡assigned¡¡instance¡¡does¡¡not¡¡change¡¡the¡¡original¡¡instance¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡However£»¡¡you¡¡can¡¡gain¡¡some¡¡control¡¡over¡¡how¡¡parameters¡¡are¡¡handled¡£¡¡When¡¡Method£¨£©¡¡is¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡declared£»¡¡the¡¡assumption¡¡is¡¡made¡¡that¡¡all¡¡of¡¡the¡¡parameters¡¡are¡¡passed¡¡to¡¡the¡¡method¡¡imple
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡mentation¡¡as¡¡value¡¡types¡£¡¡It¡¡is¡¡possible¡¡to¡¡pass¡¡the¡¡parameters¡¡to¡¡the¡¡method¡¡as¡¡reference¡¡types£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡as¡¡determined¡¡by¡¡one¡¡of¡¡the¡¡following¡¡keywords£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ByVal£º¡¡When¡¡a¡¡method¡¡has¡¡parameters¡¡declared¡¡with¡¡the¡¡ByVal¡¡keyword£»¡¡the¡¡parameter¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡has¡¡its¡¡value¡¡copied¡¡from¡¡the¡¡caller¡¡variable¡¡to¡¡method¡¡implementation¡¡variable£»¡¡even¡¡if¡¡it¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡is¡¡a¡¡reference¡¡type¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ByRef£º¡¡When¡¡a¡¡method¡¡has¡¡parameters¡¡declared¡¡with¡¡the¡¡ByRef¡¡keyword£»¡¡the¡¡caller¡¡variable¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡is¡¡not¡¡copied¡¡to¡¡the¡¡parameter¡¡variable£»¡¡rather£»¡¡the¡¡variable¡¡used¡¡by¡¡the¡¡caller¡¡and¡¡the¡¡method¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡variable¡¡are¡¡one¡¡and¡¡the¡¡same¡£¡¡Thus£»¡¡changes¡¡to¡¡the¡¡method¡¡variable£»¡¡as¡¡in¡¡the¡¡previous¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡example£»¡¡would¡¡be¡¡visible¡¡to¡¡the¡¡caller¡¡of¡¡the¡¡method¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Figure¡¡4¡6¡¡illustrates¡¡how¡¡to¡¡use¡¡the¡¡ByRef¡¡keyword¡¡so¡¡that¡¡a¡¡modified¡¡value¡¡type¡¡will¡¡be¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡visible¡¡to¡¡the¡¡caller¡¡of¡¡the¡¡method¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Now¡¡that¡¡you¡¡have¡¡an¡¡understanding¡¡of¡¡the¡¡depth¡first¡¡search¡¡algorithm¡¡and¡¡how¡¡the¡¡data¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡structure¡¡will¡¡be¡¡defined¡¡as¡¡a¡¡user¡defined¡¡value¡¡type£»¡¡let¡¯s¡¡get¡¡started¡¡building¡¡the¡¡search¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡algorithm¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡109¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡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¡¡87¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡ByRef¡¡is¡¡associated¡¡with¡¡the¡¡parameter¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡indicating¡¡that¡¡the¡¡value¡¡variable¡¡can¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡be¡¡modified¡¡in¡¡the¡¡method¡¡and¡¡the¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡result¡¡will¡¡be¡¡visible¡¡to¡¡the¡¡caller¡¡
¡¡Sub¡¡Method£¨ByRef¡¡value¡¡As¡¡MyValueType£»¡¡ByVal¡¡reference¡¡As¡¡MyReferenceType£©¡¡
¡¡¡¡¡¡¡¡¡¡value¡£value¡¡=¡¡10¡¡
¡¡¡¡¡¡¡¡¡¡reference¡£value¡¡=¡¡10¡¡
¡¡End¡¡Sub¡¡
¡¡Dim¡¡value¡¡As¡¡MyValueType¡¡
¡¡Dim¡¡reference¡¡As¡¡MyReferenceType¡¡=¡¡New¡¡MyReferenceType£¨£©¡¡
¡¡Method£¨value£»¡¡reference£©¡¡
¡¡Console¡£WriteLine£¨¡¨value¡¡value=¡¨¡¡&¡¡value¡£value¡¡&¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¨¡¡reference¡¡value=¡¨¡¡&¡¡reference¡£value£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡variable¡¡value¡£value¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡will¡¡contain¡¡the¡¡value¡¡of¡¡10¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡assigned¡¡in¡¡the¡¡method¡¡
Figure¡¡4¡6¡£¡¡¡¡Using¡¡the¡¡ByRef¡¡keyword¡¡
Organizing¡¡the¡¡Search¡¡Algorithm¡¡
The¡¡search¡¡algorithm¡¡we¡¡will¡¡write¡¡in¡¡this¡¡chapter¡¡deals¡¡with¡¡the¡¡problem¡¡of¡¡planning¡¡a¡¡flight¡¡¡¡
from¡¡point¡¡A¡¡to¡¡point¡¡B¡£¡¡The¡¡first¡¡step¡¡is¡¡to¡¡figure¡¡out¡¡the¡¡features¡¡we¡¡need¡¡to¡¡implement¡£¡¡Here¡¯s¡¡¡¡
a¡¡summary£º¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡A¡¡data¡¡structure¡¡implements¡¡the¡¡node¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡A¡¡node¡¡can¡¡contain¡¡references¡¡to¡¡other¡¡nodes¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Each¡¡node¡¡has¡¡a¡¡description¡¡and¡¡unique¡¡identifier¡¡to¡¡distinguish¡¡it¡¡from¡¡other¡¡nodes¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡All¡¡of¡¡the¡¡nodes¡¡have¡¡flight¡¡information¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡An¡¡algorithm¡¡will¡¡traverse¡¡the¡¡nodes¡¡and¡¡keep¡¡track¡¡of¡¡its¡¡path¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡¡¡The¡¡path¡¡is¡¡returned¡¡as¡¡a¡¡list¡¡of¡¡nodes¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡The¡¡data¡¡structure¡¡is¡¡based¡¡on¡¡the¡¡problem¡¡of¡¡planning¡¡a¡¡flight¡¡between¡¡two¡¡places£»¡¡as¡¡¡¡
illustrated¡¡in¡¡Figure¡¡4¡7¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡110¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
88¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡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¡7¡£¡¡Planning¡¡flight¡¡routes¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡As¡¡shown¡¡in¡¡Figure¡¡4¡7£»¡¡three¡¡main¡¡attributes¡¡describe¡¡an¡¡individual¡¡node¡¡in¡¡the¡¡flight¡¡route£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡City¡¡name£º¡¡A¡¡description¡¡that¡¡will¡¡be¡¡used¡¡as¡¡a¡¡key¡¡when¡¡a¡¡user¡¡defines¡¡a¡¡starting¡¡and¡¡end¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡point¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Coordinates£º¡¡An¡¡illustrative¡¡approach¡¡used¡¡to¡¡describe¡¡how¡¡cities¡¡are¡¡located¡¡in¡¡relation¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡to¡¡each¡¡other¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Connections£º¡¡A¡¡representative¡¡connection¡¡between¡¡two¡¡cities¡£¡¡As¡¡in¡¡real¡¡life£»¡¡not¡¡all¡¡cities¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡connect¡¡to¡¡other¡¡cities¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡For¡¡the¡¡scope¡¡of¡¡this¡¡chapter£»¡¡there¡¡are¡¡only¡¡two¡¡projects£º¡¡a¡¡class¡¡library¡¡that¡¡contains¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡depth¡first¡¡search¡¡algorithm¡¡and¡¡the¡¡testing¡¡application¡£¡¡The¡¡project¡¡structure¡¡looks¡¡like¡¡Figure¡¡4¡8¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡As¡¡with¡¡the¡¡examples¡¡in¡¡the¡¡previous¡¡chapters£»¡¡remember¡¡to¡¡add¡¡a¡¡reference¡¡to¡¡the¡¡class¡¡library¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£¨SearchSolution£©¡¡and¡¡to¡¡set¡¡the¡¡test¡¡project¡¡£¨TestSearchSolution£©¡¡as¡¡the¡¡startup¡¡project¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Figure¡¡4¡8¡£¡¡Solution¡¡project¡¡structure¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡111¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡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¡¡89¡¡
Writing¡¡the¡¡Depth¡First¡¡Search¡¡Code¡¡
We¡¡will¡¡implement¡¡the¡¡depth¡first¡¡search¡¡algorithm¡¡in¡¡three¡¡main¡¡steps¡£¡¡The¡¡first¡¡step¡¡is¡¡to¡¡¡¡
define¡¡and¡¡implement¡¡the¡¡data¡¡structure¡£¡¡The¡¡second¡¡step¡¡is¡¡to¡¡implement¡¡the¡¡algorithm¡¡and¡¡¡¡
tests¡£¡¡Finally£»¡¡we¡¯ll¡¡run¡¡the¡¡algorithm¡¡and¡¡see¡¡what¡¡route¡¡has¡¡been¡¡found¡£¡¡
Defining¡¡and¡¡Implementing¡¡the¡¡Data¡¡Structure¡¡
As¡¡I¡¡mentioned¡¡earlier£»¡¡for¡¡the¡¡most¡¡part£»¡¡developers¡¡use¡¡the¡¡Class¡¡keyword¡¡to¡¡define¡¡a¡¡data¡¡¡¡
structure¡¡as¡¡a¡¡reference¡¡type£»¡¡because¡¡of¡¡the¡¡constraints¡¡of¡¡using¡¡a¡¡value¡¡type¡£¡¡However£»¡¡for¡¡this¡¡¡¡
example£»¡¡we¡¡will¡¡start¡¡out¡¡by¡¡using¡¡the¡¡Structure¡¡keyword¡¡to¡¡define¡¡Node¡¡as¡¡a¡¡value¡¡type¡£¡¡The¡¡¡¡
depth¡first¡¡search¡¡algorithm¡¡has¡¡two¡¡distinct¡¡implementation¡¡details£º¡¡data¡¡structure¡¡and¡¡algo
rithm¡£¡¡Because¡¡each¡¡detail¡¡is¡¡separate£»¡¡it¡¡seems¡¡appropriate¡¡to¡¡define¡¡Node¡¡as¡¡a¡¡value¡¡type¡£¡¡So£»¡¡¡¡
least¡¡let¡¯s¡¡try¡¡it¡¡and¡¡see¡¡what¡¡happens¡£¡¡
¡¡¡¡¡¡¡¡¡¡As¡¡per¡¡the¡¡attributes¡¡illustrated¡¡in¡¡Figure¡¡4¡7£»¡¡the¡¡data¡¡structure¡¡that¡¡is¡¡added¡¡to¡¡the¡¡¡¡
SearchSolution¡¡p