ÓÑÇéÌáʾ£ºÈç¹û±¾ÍøÒ³´ò¿ªÌ«Âý»òÏÔʾ²»ÍêÕû£¬Çë³¢ÊÔÊó±êÓÒ¼ü¡°Ë¢Ð¡±±¾ÍøÒ³£¡
¸»Ê¿¿µÐ¡ËµÍø ·µ»Ø±¾ÊéĿ¼ ¼ÓÈëÊéÇ© ÎÒµÄÊé¼Ü ÎÒµÄÊéÇ© TXTÈ«±¾ÏÂÔØ ¡ºÊղص½ÎÒµÄä¯ÀÀÆ÷¡»

VB2008´ÓÈëÃŵ½¾«Í¨(PDF¸ñʽӢÎÄ°æ)-µÚ45²¿·Ö

¿ì½Ý²Ù×÷: °´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·­Ò³ °´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ °´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿! Èç¹û±¾ÊéûÓÐÔĶÁÍ꣬ÏëÏ´μÌÐø½Ó×ÅÔĶÁ£¬¿ÉʹÓÃÉÏ·½ "Êղص½ÎÒµÄä¯ÀÀÆ÷" ¹¦ÄÜ ºÍ "¼ÓÈëÊéÇ©" ¹¦ÄÜ£¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡internal¡¡array¡£¡¡This¡¡class¡¡manages¡¡the¡¡problem¡¡of¡¡increasing¡¡the¡¡size¡¡of¡¡an¡¡array¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Hashtable£º¡¡A¡¡collection¡¡class¡¡where¡¡the¡¡individual¡¡objects¡¡are¡¡stored¡¡using¡¡key/value¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡pairs¡£¡¡In¡¡the¡¡previous¡¡chapter£»¡¡the¡¡indexer¡¡was¡¡used¡¡to¡¡retrieve¡¡a¡¡room¡¡grouping¡¡based¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡on¡¡its¡¡identifier¡£¡¡You¡¡could¡¡use¡¡a¡¡Hashtable¡¡to¡¡acplish¡¡the¡¡same¡¡thing¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡ICollection£º¡¡An¡¡interface¡¡implement¡¡by¡¡ArrayList¡¡that¡¡provides¡¡basic¡¡functionality¡¡that¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡copies¡¡the¡¡references¡¡to¡¡another¡¡array¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡IDictionary£º¡¡An¡¡interface¡¡implemented¡¡by¡¡Hashtable¡¡that¡¡allows¡¡a¡¡programmer¡¡to¡¡asso

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ciate¡¡a¡¡key¡¡with¡¡a¡¡value¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡IList£º¡¡An¡¡interface¡¡implemented¡¡by¡¡ArrayList¡¡that¡¡provides¡¡a¡¡general¡­access¡¡mechanism¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡for¡¡manipulating¡¡a¡¡collection¡¡of¡¡items¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Queue£º¡¡A¡¡collection¡¡that¡¡implements¡¡the¡¡first¡¡in£»¡¡first¡¡out¡¡£¨FIFO£©¡¡mechanism¡£¡¡You¡¡could¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡use¡¡a¡¡queue¡¡when¡¡you¡¡are¡¡processing¡¡a¡¡set¡¡of¡¡instructions¡£¡¡The¡¡first¡¡instruction¡¡to¡¡process¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡would¡¡be¡¡the¡¡first¡¡instruction¡¡added¡¡to¡¡the¡¡collection¡£¡¡¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Stack£º¡¡A¡¡collection¡¡that¡¡implements¡¡the¡¡last¡¡in£»¡¡first¡¡out¡¡£¨LIFO£©¡¡mechanism¡£¡¡Think¡¡of¡¡it¡¡as¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡stack¡¡of¡¡papers¡£¡¡When¡¡one¡¡piece¡¡of¡¡paper¡¡is¡¡laid¡¡on¡¡top¡¡of¡¡another£»¡¡the¡¡first¡¡piece¡¡of¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡paper¡¡that¡¡is¡¡processed¡¡is¡¡the¡¡last¡¡piece¡¡of¡¡paper¡¡added¡¡to¡¡the¡¡stack¡¡of¡¡papers¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡All¡¡of¡¡the¡¡collection¡¡types¡ªArrayList£»¡¡Hashtable£»¡¡Queue£»¡¡and¡¡Stack¡ªimplement¡¡a¡¡way¡¡to¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡store¡¡a¡¡set¡¡of¡¡types¡£¡¡The¡¡difference¡¡in¡¡the¡¡collection¡¡types¡¡lies¡¡in¡¡how¡¡the¡¡individual¡¡objects¡¡are¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡stored¡¡and¡¡retrieved¡¡from¡¡the¡¡collection¡£¡¡For¡¡examples¡¡of¡¡using¡¡these¡¡collection¡¡types£»¡¡see¡¡the¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡°Learning¡¡More¡¡About¡¡Collection¡¡Types¡±¡¡section¡¡later¡¡in¡¡this¡¡chapter¡£¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Let¡¯s¡¡walk¡¡through¡¡an¡¡example¡¡of¡¡using¡¡these¡¡collection¡¡classes¡£¡¡Begin¡¡by¡¡creating¡¡a¡¡console¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡application¡¡and¡¡call¡¡it¡¡OneToManySamples¡£¡¡Then¡¡add¡¡a¡¡new¡¡class¡¡£¨right¡­click¡¡your¡¡console¡¡appli

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡cation¡¡project¡¡and¡¡select¡¡Add¡¡¡¡Class£©¡£¡¡Call¡¡it¡¡¡¡Example¡£vb¡¡and¡¡add¡¡all¡¡of¡¡the¡¡following¡¡code¡¡to¡¡it£º¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Class¡¡Example¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Property¡¡Value£¨£©¡¡As¡¡Integer¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Get¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡_value¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Get¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Set£¨ByVal¡¡value¡¡As¡¡Integer£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_value¡¡=¡¡value¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Set¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Property¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Private¡¡_value¡¡As¡¡Integer¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Class¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Friend¡¡Module¡¡Tests¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Private¡¡Sub¡¡PlainVanillaObjects£¨£©¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡objects¡¡As¡¡IList¡¡=¡¡New¡¡ArrayList£¨£©¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡253¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡C¡¡HA¡¡P¡¡TE¡¡R¡¡¡¡¡¡9¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡AR¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡O¡¡U¡¡T¡¡¡¡L¡¡I¡¡ST¡¡S£»¡¡¡¡¡¡DE¡¡L¡¡E¡¡G¡¡AT¡¡E¡¡S¡¡£»¡¡¡¡¡¡AN¡¡D¡¡¡¡L¡¡A¡¡M¡¡B¡¡D¡¡A¡¡¡¡E¡¡X¡¡PR¡¡E¡¡SSI¡¡O¡¡N¡¡S¡¡¡¡231¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡objects¡£Add£¨New¡¡Example¡¡With¡¡£û¡£Value¡¡=¡¡10£ý£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡objects¡£Add£¨New¡¡Example¡¡With¡¡£û¡£Value¡¡=¡¡20£ý£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡For¡¡Each¡¡obj¡¡As¡¡Example¡¡In¡¡objects¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Console¡£WriteLine£¨¡¨Object¡¡value¡¡£¨¡¨¡¡&¡¡obj¡£Value¡¡&¡¡¡¨£©¡¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Next¡¡

¡¡¡¡¡¡¡¡End¡¡Sub¡¡

¡¡¡¡¡¡¡¡Public¡¡Sub¡¡RunAll£¨£©¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡PlainVanillaObjects£¨£©¡¡

¡¡¡¡¡¡¡¡End¡¡Sub¡¡

End¡¡Module¡¡



¡¡¡¡¡¡¡¡¡¡This¡¡is¡¡the¡¡type¡¡of¡¡code¡¡written¡¡before¡¡Visual¡¡Basic¡¡2005£»¡¡and¡¡it¡¡follows¡¡a¡¡standard¡¡set¡¡of¡¡steps£º¡¡



¡¡¡¡¡¡¡¡¡¡1¡£¡¡¡¡You¡¡define¡¡a¡¡custom¡¡type¡¡£¨¡¡Example¡¡in¡¡this¡¡example£©¡£¡¡



¡¡¡¡¡¡¡¡¡¡2¡£¡¡¡¡You¡¡instantiate¡¡the¡¡custom¡¡type¡¡and¡¡add¡¡the¡¡instances¡¡to¡¡a¡¡collection¡£¡¡In¡¡the¡¡example£»¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡two¡¡instances¡¡of¡¡Example¡¡are¡¡added¡¡to¡¡the¡¡collection¡¡type¡¡ArrayList¡£¡¡¡¡



¡¡¡¡¡¡¡¡¡¡3¡£¡¡¡¡The¡¡collection¡¡is¡¡manipulated¡¡to¡¡allow¡¡you¡¡to¡¡access¡¡and¡¡manipulate¡¡the¡¡instances¡¡of¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡custom¡¡types¡£¡¡In¡¡the¡¡example£»¡¡the¡¡collection¡¡ArrayList¡¡is¡¡an¡¡interface¡¡instance¡¡of¡¡IList¡£¡¡



¡¡¡¡¡¡¡¡¡¡The¡¡bolded¡¡code¡¡in¡¡the¡¡example¡¡is¡¡where¡¡the¡¡action¡¡takes¡¡place¡£¡¡Instantiating¡¡the¡¡type¡¡¡¡

ArrayList¡¡is¡¡the¡¡instantiation¡¡of¡¡a¡¡collection¡¡manager¡£¡¡The¡¡ArrayList¡¡instance¡¡is¡¡then¡¡assigned¡¡¡¡

to¡¡the¡¡variable¡¡objects£»¡¡which¡¡is¡¡of¡¡type¡¡IList¡£¡¡IList¡¡is¡¡an¡¡interface¡¡making¡¡it¡¡possible¡¡to¡¡use¡¡the¡¡¡¡

collection¡¡in¡¡the¡¡context¡¡of¡¡a¡¡ponent¡­oriented¡¡development¡¡environment¡£¡¡To¡¡add¡¡two¡¡objects¡¡¡¡

to¡¡the¡¡collection£»¡¡we¡¡call¡¡the¡¡Add£¨£©¡¡method¡¡twice¡£¡¡To¡¡iterate¡¡the¡¡elements¡¡in¡¡the¡¡collection£»¡¡we¡¡¡¡

use¡¡the¡¡¡¡For¡¡Each¡¡statement¡£¡¡



¡öNote¡¡¡¡The¡¡fact¡¡that¡¡the¡¡collection¡¡classes¡¡can¡¡be¡¡used¡¡in¡¡the¡¡context¡¡of¡¡a¡¡ponent¡­oriented¡¡application¡¡¡¡

is¡¡no¡¡coincidence¡£¡¡When¡¡Microsoft¡¡created¡¡its¡¡¡¡library£»¡¡ponents¡¡were¡¡an¡¡essential¡¡part¡¡of¡¡the¡¡library¡£¡¡¡¡



¡¡¡¡¡¡¡¡¡¡To¡¡run¡¡the¡¡tests£»¡¡open¡¡Module1¡£vb¡¡in¡¡your¡¡console¡¡application¡¡and¡¡edit¡¡it¡¡as¡¡follows£º¡¡



Module¡¡Module1¡¡

¡¡¡¡¡¡¡¡Sub¡¡Main£¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡BeforeVisualBasic8¡£Tests¡£RunAll£¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Console¡£ReadKey£¨£©¡¡

¡¡¡¡¡¡¡¡End¡¡Sub¡¡

End¡¡Module¡¡



¡¡¡¡¡¡¡¡¡¡Press¡¡Ctrl£«F5¡¡to¡¡run¡¡the¡¡application¡¡and¡¡see¡¡the¡¡results¡£¡¡



¡öNote¡¡¡¡We¡¡did¡¡not¡¡need¡¡to¡¡import¡¡the¡¡System¡£Collections¡¡namespace¡¡because¡¡it¡¡is¡¡imported¡¡by¡¡default¡¡¡¡

in¡¡Visual¡¡Basic¡¡2008¡£¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡254¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

232¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡9¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡IN¡¡G¡¡¡¡¡¡AB¡¡OU¡¡T¡¡¡¡¡¡L¡¡I¡¡ST¡¡S£»¡¡¡¡¡¡D¡¡E¡¡L¡¡E¡¡G¡¡A¡¡T¡¡E¡¡S£»¡¡¡¡¡¡A¡¡N¡¡D¡¡¡¡¡¡L¡¡A¡¡M¡¡B¡¡DA¡¡¡¡¡¡E¡¡X¡¡P¡¡R¡¡E¡¡S¡¡SI¡¡ON¡¡S¡¡¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡Problem¡¡of¡¡Mixed¡¡Types¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡What¡¡is¡¡unique¡¡about¡¡the¡¡sample¡¡code¡¡is¡¡that¡¡the¡¡¡¡For¡¡Each¡¡statement¡¡works¡¡and¡¡happens¡¡to¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡know¡¡that¡¡the¡¡objects¡¡in¡¡the¡¡collection¡¡are¡¡of¡¡type¡¡Example¡£¡¡However£»¡¡the¡¡following¡¡code¡¡adds¡¡a¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡different¡¡object¡¡to¡¡the¡¡collection£»¡¡which¡¡will¡¡cause¡¡the¡¡iteration¡¡to¡¡fail¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Class¡¡Another¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Class¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡objects¡¡As¡¡IList¡¡=¡¡New¡¡ArrayList£¨£©¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡objects¡£Add£¨New¡¡Example¡¡With¡¡£û¡£Value¡¡=¡¡10£ý£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡objects¡£Add£¨New¡¡Example¡¡With¡¡£û¡£Value¡¡=¡¡20£ý£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡objects¡£Add£¨New¡¡Another£¨£©£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡For¡¡Each¡¡obj¡¡As¡¡Example¡¡In¡¡objects¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Console¡£WriteLine£¨¡¨Object¡¡value¡¡£¨¡¨¡¡&¡¡obj¡£Value¡¡&¡¡¡¨£©¡¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Next¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡bolded¡¡code¡¡illustrates¡¡how¡¡the¡¡collection¡¡object¡¡contains¡¡two¡¡instances¡¡of¡¡Example¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡and¡¡one¡¡instance¡¡of¡¡Another¡£¡¡The¡¡code¡¡will¡¡pile£»¡¡which¡¡misleads¡¡you¡¡into¡¡believing¡¡every

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡thing¡¡is¡¡fine¡£¡¡If¡¡you¡¡try¡¡to¡¡run¡¡the¡¡application¡¡£¨either¡¡normally¡¡or¡¡in¡¡debug¡¡mode£©£»¡¡you¡¡will¡¡see¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡something¡¡similar¡¡to¡¡the¡¡following£º¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Unable¡¡to¡¡cast¡¡object¡¡of¡¡type¡¡'OneToManySamples¡£Another'¡¡to¡¡type¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡'OneToManySamples¡£Example'¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡So£»¡¡should¡¡a¡¡collection¡¡contain¡¡multiple¡¡types£¿¡¡There¡¡are¡¡arguments¡¡for¡¡and¡¡against¡¡the¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡idea£»¡¡but¡¡the¡¡problem¡¡is¡¡not¡¡the¡¡ability¡¡to¡¡mix¡¡types¡£¡¡The¡¡problem¡¡is¡¡that¡¡you¡¡can¡¡mix¡¡types£»¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡even¡¡if¡¡you¡¡don¡¯t¡¡really¡¡intend¡¡to¡¡do¡¡that¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Using¡¡the¡¡¡¡For¡¡Each¡¡statement¡¡with¡¡mixed¡¡types¡¡will¡¡result¡¡in¡¡an¡¡exception£»¡¡because¡¡for¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡each¡¡iteration£»¡¡the¡¡object¡¡in¡¡the¡¡collection¡¡is¡¡cast¡¡to¡¡a¡¡type¡¡Example¡£¡¡As¡¡the¡¡last¡¡item¡¡in¡¡the¡¡collec

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡tion¡¡is¡¡of¡¡type¡¡Another£»¡¡the¡¡cast¡¡will¡¡fail£»¡¡and¡¡an¡¡exception¡¡will¡¡be¡¡generated¡£¡¡Collections¡¡before¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡2¡£0¡¡could¡¡not¡¡enforce¡¡type¡¡consistency£»¡¡and¡¡that¡¡was¡¡a¡¡problem¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Had¡¡you¡¡desired¡¡to¡¡mix¡¡types£»¡¡the¡¡proper¡¡¡¡For¡¡Each¡¡loop¡¡would¡¡have¡¡been¡¡as¡¡follows£º¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡objects¡¡As¡¡IList¡¡=¡¡new¡¡ArrayList£¨£©¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡objects¡£Add£¨New¡¡Example¡¡With¡¡£û¡£Value¡¡=¡¡10£ý£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡objects¡£Add£¨New¡¡Example¡¡With¡¡£û¡£Value¡¡=¡¡20£ý£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡objects¡£Add£¨New¡¡Another£¨£©£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡For¡¡Each¡¡obj¡¡As¡¡Object¡¡In¡¡objects¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡TypeOf¡¡£¨obj£©¡¡Is¡¡Example¡¡Then¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡example¡¡As¡¡Example¡¡=¡¡CType£¨obj£»¡¡Example£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Console¡£WriteLine£¨¡¨Object¡¡value¡¡£¨¡¨¡¡&¡¡example¡£Value¡¡&¡¡¡¨£©¡¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ElseIf¡¡TypeOf¡¡£¨obj£©¡¡Is¡¡Another¡¡Then¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Console¡£WriteLine£¨¡¨This¡¡is¡¡another¡¡object¡¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡If¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Next¡¡¡¡¡¡¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡255¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡C¡¡HA¡¡P¡¡TE¡¡R¡¡¡¡¡¡9¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡AR¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡O¡¡U¡¡T¡¡¡¡L¡¡I¡¡ST¡¡S£»¡¡¡¡¡¡DE¡¡L¡¡E¡¡G¡¡AT¡¡E¡¡S¡¡£»¡¡¡¡¡¡AN¡¡D¡¡¡¡L¡¡A¡¡M¡¡B¡¡D¡¡A¡¡¡¡E¡¡X¡¡PR¡¡E¡¡SSI¡¡O¡¡N¡¡S¡¡¡¡233¡¡



The¡¡Problem¡¡of¡¡Value¡¡Types¡¡



Another¡¡issue¡¡with¡¡pre¡­Visual¡¡Basic¡¡2005¡¡collections¡¡is¡¡that¡¡they¡¡have¡¡performance¡¡problems¡£¡¡¡¡

Consider¡¡the¡¡following¡¡code¡¡that¡¡manipulates¡¡value¡¡types¡£¡¡



Dim¡¡objects¡¡As¡¡IList¡¡=¡¡New¡¡ArrayList£¨£©¡¡

objects¡£Add£¨1£©¡¡

objects¡£Add£¨2£©¡¡

For¡¡Each¡¡val¡¡as¡¡Integer¡¡in¡¡objects¡¡

¡¡¡¡¡¡¡¡Console¡£WriteLine£¨¡¨Value¡¡£¨¡¨¡¡&¡¡val¡¡&¡¡¡¨£©¡¨£©¡¡

Next¡¡



¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡example£»¡¡an¡¡ArrayList¡¡is¡¡again¡¡instantiated£»¡¡but¡¡this¡¡time£»¡¡the¡¡numbers¡¡1¡¡and¡¡2¡¡are¡¡¡¡

added¡¡to¡¡the¡¡collection¡£¡¡Then£»¡¡in¡¡the¡¡For¡¡Each¡¡statement£»¡¡the¡¡integers¡¡are¡¡iterated¡£¡¡The¡¡code¡¡¡¡

works£»¡¡but¡¡there¡¡is¡¡a¡¡hidden¡¡performance¡¡hit¡£¡¡The¡¡items¡¡added¡¡to¡¡the¡¡collection¡¡are¡¡value¡¡types£»¡¡¡¡

which¡¡means¡¡you¡¡are¡¡manipulating¡¡stack¡­based¡¡memory¡£¡¡

¡¡¡¡¡¡¡¡¡¡However£»¡¡the¡¡definition¡¡of¡¡IList¡¡uses¡¡objects£º¡¡



Public¡¡Interface¡¡IIList¡¡

¡¡¡¡¡¡¡¡Inherits¡¡ICollection£»¡¡IEnumerable¡¡



¡¡¡¡¡¡¡¡'¡¡Methods¡¡

¡¡¡¡¡¡¡¡Function¡¡Add£¨ByVal¡¡value¡¡As¡¡Object£©¡¡As¡¡Integer¡¡

¡¡¡¡¡¡¡¡Sub¡¡Clear£¨£©¡¡

¡¡¡¡¡¡¡¡Function¡¡Contains£¨ByVal¡¡value¡¡As¡¡Object£©¡¡As¡¡Boolean¡¡

¡¡¡¡¡¡¡¡Function¡¡IndexOf£¨ByVal¡¡value¡¡As¡¡Object£©¡¡As¡¡Integer¡¡

¡¡¡¡¡¡¡¡Sub¡¡Insert£¨ByVal¡¡index¡¡As¡¡Integer£»¡¡ByVal¡¡value¡¡As¡¡Object£©¡¡

¡¡¡¡¡¡¡¡Sub¡¡Remove£¨ByVal¡¡value¡¡As¡¡Object£©¡¡

¡¡¡¡¡¡¡¡Sub¡¡RemoveAt£¨ByVal¡¡index¡¡As¡¡Integer£©¡¡



¡¡¡¡¡¡¡¡'¡¡Properties¡¡

¡¡¡¡¡¡¡¡ReadOnly¡¡Property¡¡IsFixedSize£¨£©¡¡As¡¡Boolean¡¡

¡¡¡¡¡¡¡¡ReadOnly¡¡Property¡¡IsReadOnly£¨£©¡¡As¡¡Boolean¡¡

¡¡¡¡¡¡¡¡Property¡¡Item£¨ByVal¡¡index¡¡As¡¡Integer£©¡¡As¡¡Object¡¡



End¡¡Interface¡¡



¡¡¡¡¡¡¡¡¡¡How¡¡IList¡¡is¡¡defined¡¡and¡¡how¡¡a¡¡value¡¡type¡¡is¡¡defined¡¡should¡¡raise¡¡alarms¡£¡¡An¡¡object¡¡is¡¡a¡¡¡¡

reference¡¡type£»¡¡and¡¡thus¡¡you¡¡have¡¡a¡¡conflict£º¡¡IList¡¡stores¡¡reference¡¡types£»¡¡but¡¡Integer¡¡is¡¡a¡¡value¡¡¡¡

type¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡What¡¯s¡¡happening¡¡is¡¡that¡¡the¡¡¡¡environment¡¡knows¡¡that¡¡there¡¡is¡¡a¡¡conflict¡¡and¡¡adds¡¡a¡¡¡¡

fix¡£¡¡Don¡¯t¡¡think¡¡of¡¡the¡¡fix¡¡as¡¡a¡¡hack£»¡¡but¡¡as¡¡a¡¡way¡¡of¡¡solving¡¡a¡¡problem¡¡that¡¡all¡¡virtual¡¡machine¡¡¡¡

environments¡¡like¡¡¡¡need¡¡to¡¡address¡£¡¡The¡¡¡¡environment¡¡uses¡¡the¡¡terms¡¡boxing¡¡and¡¡¡¡

unboxing¡¡to¡¡denote¡¡converting¡¡a¡¡value¡¡type¡¡into¡¡a¡¡reference¡¡type¡¡and¡¡then¡¡back¡¡again£»¡¡respectively¡£¡¡

¡¡¡¡¡¡¡¡¡¡To¡¡understand¡¡boxing¡¡and¡¡unboxing£»¡¡let¡¯s¡¡consider¡¡the¡¡context¡£¡¡You¡¡are¡¡creating¡¡a¡¡list¡¡that¡¡¡¡

references¡¡value¡¡types¡£¡¡The¡¡array¡¡is¡¡a¡¡reference¡¡type¡¡that¡¡is¡¡stored¡¡on¡¡the¡¡heap£»¡¡but¡¡value¡¡types¡¡are¡¡¡¡

stored¡¡on¡¡the¡¡stack¡£¡¡If¡¡you¡¡get¡¡the¡¡array¡¡to¡¡reference¡¡data¡¡on¡¡the¡¡stack£»¡¡you¡¡will¡¡have¡¡a¡¡consistency¡¡¡¡

issue£»¡¡since¡¡the¡¡stack¡¡changes¡£¡¡Thus£»¡¡you¡¡will¡¡need¡¡to¡¡move¡¡the¡¡memory¡¡from¡¡the¡¡stack¡¡to¡¡the¡¡¡¡

heap£»¡¡but¡¡that¡¡would¡¡violate¡¡the¡¡principle¡¡behind¡¡value¡¡types¡£¡¡The¡¡solution¡¡is¡¡the¡¡promise¡¡¡¡

of¡¡boxing¡¡and¡¡unboxing¡£¡¡¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡256¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

234¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡9¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡IN¡¡G¡¡¡¡¡¡AB¡¡OU¡¡T¡¡¡¡¡¡L¡¡I¡¡ST¡¡S£»¡¡¡¡¡¡D¡¡E¡¡L¡¡E¡¡G¡¡A¡¡T¡¡E¡¡S£»¡¡¡¡¡¡A¡¡N¡¡D¡¡¡¡¡¡L¡¡A¡¡M¡¡B¡¡DA¡¡¡¡¡¡E¡¡X¡¡P¡¡R¡¡E¡¡S¡¡SI¡¡ON¡¡S¡¡¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡To¡¡illustrate¡¡what¡¡boxing¡¡does£»¡¡I¡¡have¡¡written¡¡some¡¡code¡¡that¡¡is¡¡similar¡¡to¡¡the¡¡boxing¡¡of¡¡a¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡value¡¡type¡£¡¡The¡¡difference¡¡is¡¡that¡¡my¡¡code¡¡is¡¡explicit¡¡and¡¡boxing¡¡is¡¡done¡¡automatically¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Class¡¡ReferenceHeap¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Value¡¡As¡¡Integer¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Class¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£¡¡¡£¡¡¡£¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡Method£¨£©¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡onStack¡¡As¡¡Integer¡¡=¡¡1¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡onHeap¡¡As¡¡ReferenceHeap¡¡=¡¡New¡¡ReferenceHeap£¨£©¡¡With¡¡£û¡¡¡£Value¡¡=¡¡onStack¡¡£ý¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡example£»¡¡Method£¨£©¡¡declares¡¡a¡¡value¡­type¡¡variable¡¡named¡¡onStack£»¡¡which¡¡is¡¡allocated¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡in¡¡the¡¡context¡¡of¡¡a¡¡method¡¡and¡¡is¡¡thus¡¡on¡¡the¡¡stack¡£¡¡The¡¡type¡¡ReferenceHeap¡¡is¡¡a¡¡class£»¡¡and¡¡thus¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡reference¡¡type£»¡¡and¡¡automatically¡¡all¡¡of¡¡its¡¡data¡¡is¡¡stored¡¡on¡¡the¡¡heap¡£¡¡When¡¡the¡¡variable¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡onHeap¡¡is¡¡allocated¡¡and¡¡initialized£»¡¡the¡¡value¡¡from¡¡onStack¡¡is¡¡copied¡¡to¡¡the¡¡heap¡¡and¡¡assigned¡¡to¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡instance¡¡onHeap¡£¡¡This¡¡is¡¡what¡¡boxing¡¡does£»¡¡except¡¡Visual¡¡Basic¡¡does¡¡it¡¡automatically¡¡and¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡transparently¡£¡¡¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡öNote¡¡¡¡It¡¡is¡¡important¡¡to¡¡remember¡¡that¡¡when¡¡you¡¡box¡¡and¡¡unbox£»¡¡you¡¡are¡¡copying¡¡values¡¡back¡¡and¡¡forth¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡between¡¡the¡¡stack¡¡and¡¡the¡¡heap¡£¡¡Thus£»¡¡if¡¡the¡¡variable¡¡onStack¡¡is¡¡changed£»¡¡the¡¡value¡¡of¡¡onHeap¡¡does¡¡not¡¡change¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Unboxing¡¡refers¡¡to¡¡copying¡¡the¡¡value¡¡from¡¡the¡¡heap¡¡to¡¡the¡¡stack£»¡¡which¡¡in¡¡the¡¡case¡¡of¡¡the¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡example£»¡¡means¡¡transferring¡¡the¡¡value¡¡from¡¡the¡¡variable¡¡onHeap¡¡to¡¡onStack¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Boxing/unboxing¡¡happens¡¡automatically£»¡¡but¡¡it¡¡has¡¡a¡¡performance¡¡penalty£»¡¡since¡¡memory¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡is¡¡allocated¡¡and¡¡assigned¡£¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Managing¡¡a¡¡Collection¡¡After¡¡Visual¡¡Basic¡¡2005¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡two¡¡problems¡¡of¡¡storing¡¡mixed¡¡object¡¡types¡¡and¡¡the¡¡performance¡¡penalty¡¡of¡¡boxing/unboxing¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡required¡¡Microsoft¡¡to¡¡carefully¡¡consider¡¡a¡¡solution¡£¡¡After¡¡much¡¡debate¡¡and¡¡thinking£»¡¡Microsoft¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡introduced¡¡¡¡generics¡£¡¡In¡¡a¡¡nutshell£»¡¡¡¡generics¡¡solve¡¡both¡¡collection¡¡problems¡¡by¡¡enforcing¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡type¡£¡¡£¨¡¡generics¡¡solve¡¡broader¡¡problems¡¡as¡¡well¡££©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Collections¡¡are¡¡an¡¡ideal¡¡application¡¡of¡¡¡¡generics¡¡because¡¡collections¡¡are¡¡utilitarian¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡You¡¡don¡¯t¡¡use¡¡collections¡¡to¡¡solve¡¡the¡¡problem¡¡of¡¡calculating¡¡taxes¡£¡¡You¡¡use¡¡collections¡¡to¡¡solve¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡problem¡¡of¡¡how¡¡to¡¡create¡¡a¡¡collection¡¡of¡¡ines¡¡and¡¡a¡¡collection¡¡of¡¡deductions¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Here¡¡is¡¡an¡¡example¡¡of¡¡how¡¡to¡¡use¡¡¡¡generics¡­based¡¡collections¡¡£¨they¡¡are¡¡in¡¡the¡¡System¡£¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Collections¡£Generic¡¡namespace£»¡¡which¡¡we¡¡also¡¡do¡¡not¡¡need¡¡to¡¡import£©£º¡¡



¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡lst¡¡As¡¡IList£¨Of¡¡Example£©¡¡=¡¡New¡¡List£¨Of¡¡Example£©£¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡lst¡£Add£¨New¡¡Example£¨£©¡¡With¡¡£û¡¡¡£Value¡¡=¡¡10¡¡£ý£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡lst¡£Add£¨New¡¡Example£¨£©¡¡With¡¡£û¡¡¡£Value¡¡=¡¡20¡¡£ý£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡For¡¡Each¡¡item¡¡As¡¡Example¡¡In¡¡lst¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Console¡£WriteLine£¨¡¨item¡¡£¨¡¨¡¡&¡¡item¡£Value¡¡&¡¡¡¨£©¡¨£©¡¡

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Next¡¡


¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­Page¡¡257¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­¡­

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡C¡¡HA¡¡P¡¡TE¡¡R¡¡¡¡¡¡9¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡AR¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡O¡¡U¡¡T¡¡¡¡L¡¡I¡¡ST¡¡S£»¡¡¡¡¡¡DE¡¡L¡¡E¡¡G¡¡AT¡¡E¡¡S¡¡£»¡¡¡¡¡¡AN¡¡D¡¡¡¡L¡¡A¡¡M¡¡B¡¡D¡¡A¡¡¡¡E¡¡X¡¡PR¡¡E¡¡SSI¡¡O¡¡N¡¡S¡¡¡¡235¡¡



¡¡¡¡¡¡¡¡¡¡The¡¡bolded¡¡line¡¡represents¡¡the¡¡¡¡generics¡­based¡¡code¡£¡¡The¡¡code¡¡used¡¡to¡¡add¡¡an¡¡object¡¡¡¡

and¡¡the¡¡For¡¡Each¡¡loop¡¡are¡¡identical¡¡to¡¡that¡¡used¡¡in¡¡the¡¡pre¡­Visual¡¡Basic¡¡2005¡¡example¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡Between¡¡the¡¡brackets¡¡in¡¡the¡¡type¡¡declaration¡¡and¡¡after¡¡the¡¡Of¡¡keyword¡¡is¡¡an¡¡identifier¡¡that¡¡¡¡

is¡¡the¡¡specialization¡¡of¡¡the¡¡general¡¡approach¡£¡¡Whatever¡¡is¡¡inside¡¡the¡¡brackets¡¡when¡¡you¡¡declare¡¡¡¡

an¡¡IList¡¡or¡¡¡¡List¡¡is¡¡saying£»¡¡¡°I¡¡want¡¡my¡¡collection¡¡to¡¡contain¡¡instances¡¡of¡¡the¡¡type¡¡defined¡¡inside¡¡¡¡

the¡¡brackets¡£¡±¡¡You¡¡cannot¡¡add¡¡any¡¡objects¡¡that¡¡are¡¡not¡¡related¡¡to¡¡the¡¡type¡¡defined¡¡in¡¡IList¡¡or¡¡¡¡

List£»¡¡so¡¡the¡¡following¡¡code¡¡would¡¡not¡¡pile¡£¡¡¡¡



lst¡£Add£¨New¡¡Another£¨£©£©¡¡



¡¡¡¡¡¡¡¡¡¡This¡¡is¡¡because¡¡the¡¡¡¡generics¡¡collection¡¡is¡¡type¡­safe¡¡and¡¡does¡¡not¡¡allow¡¡mixed¡¡types¡£¡¡¡¡

It¡¡allows¡¡only¡¡objects¡¡of¡¡type¡¡¡¡Example¡£¡¡¡¡

¡¡¡¡¡¡¡¡¡¡When¡¡you¡¡declare¡¡a¡¡list¡¡like¡¡this£º¡¡



Dim¡¡lst
·µ»ØĿ¼ ÉÏÒ»Ò³ ÏÂÒ»Ò³ »Øµ½¶¥²¿ ÔÞ£¨11£© ²È£¨11£©
¿ì½Ý²Ù×÷: °´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·­Ò³ °´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ °´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿!
ÎÂÜ°Ìáʾ£º ο´Ð¡ËµµÄͬʱ·¢±íÆÀÂÛ£¬Ëµ³ö×Ô¼ºµÄ¿´·¨ºÍÆäËüС»ï°éÃÇ·ÖÏíÒ²²»´íŶ£¡·¢±íÊéÆÀ»¹¿ÉÒÔ»ñµÃ»ý·ÖºÍ¾­Ñé½±Àø£¬ÈÏÕæдԭ´´ÊéÆÀ ±»²ÉÄÉΪ¾«ÆÀ¿ÉÒÔ»ñµÃ´óÁ¿½ð±Ò¡¢»ý·ÖºÍ¾­Ñé½±ÀøŶ£¡