ÓÑÇéÌáʾ£ºÈç¹û±¾ÍøÒ³´ò¿ªÌ«Âý»òÏÔʾ²»ÍêÕû£¬Çë³¢ÊÔÊó±êÓÒ¼ü¡°Ë¢Ð¡±±¾ÍøÒ³£¡
VB2008´ÓÈëÃŵ½¾«Í¨(PDF¸ñʽӢÎÄ°æ)-µÚ74²¿·Ö
¿ì½Ý²Ù×÷: °´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·ҳ °´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ °´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿! Èç¹û±¾ÊéûÓÐÔĶÁÍ꣬ÏëÏ´μÌÐø½Ó×ÅÔĶÁ£¬¿ÉʹÓÃÉÏ·½ "Êղص½ÎÒµÄä¯ÀÀÆ÷" ¹¦ÄÜ ºÍ "¼ÓÈëÊéÇ©" ¹¦ÄÜ£¡
probably¡¡be¡¡identical£»¡¡but¡¡you¡¡need¡¡to¡¡be¡¡100£¥¡¡certain¡£¡¡
The¡¡Important¡¡Stuff¡¡to¡¡Remember¡¡
In¡¡this¡¡chapter£»¡¡you¡¡learned¡¡how¡¡to¡¡process¡¡a¡¡stream¡¡of¡¡data¡¡using¡¡the¡¡console¡£¡¡Here¡¡are¡¡the¡¡¡¡
main¡¡items¡¡to¡¡remember£º¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡When¡¡data¡¡is¡¡moved¡¡from¡¡one¡¡medium¡¡to¡¡another£»¡¡it¡¡is¡¡streamed¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡There¡¡are¡¡two¡¡major¡¡types¡¡of¡¡streams£º¡¡text¡¡and¡¡binary¡£¡¡
¡¡¡¡¡¡¡¡¡¡o¡¡Text¡¡streams¡¡are¡¡universal¡¡and¡¡can¡¡be¡¡read¡¡by¡¡all¡¡puters¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡306¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
284¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡TE¡¡N¡¡CE¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Binary¡¡streams¡¡are¡¡specific¡¡to¡¡the¡¡program¡¡and¡¡sometimes¡¡to¡¡the¡¡processor¡£¡¡Imagine¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡situation¡¡of¡¡having¡¡to¡¡decipher¡¡a¡¡C£«£«¡¡data¡¡stream¡¡generated¡¡by¡¡a¡¡PowerPC¡¡chip¡£¡¡Most¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡likely£»¡¡the¡¡numbers¡¡that¡¡you¡¡read¡¡will¡¡be¡¡wrong¡¡because¡¡of¡¡the¡¡way¡¡that¡¡Intel¡¡or¡¡AMD¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡chips¡¡store¡¡their¡¡numbers¡£¡¡Generally¡¡speaking£»¡¡with¡¡binary¡¡streams£»¡¡you¡¡will¡¡be¡¡conversing¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡with¡¡two¡¡¡¡implementations¡£¡¡If¡¡not£»¡¡use¡¡text¡¡streams¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡When¡¡streaming¡¡data£»¡¡it¡¡is¡¡best¡¡to¡¡customize¡¡as¡¡little¡¡as¡¡possible¡£¡¡Doing¡¡so¡¡will¡¡pli
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡cate¡¡your¡¡program£»¡¡and¡¡potentially¡¡introduce¡¡errors¡¡where¡¡none¡¡should¡¡exist¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡It¡¡is¡¡important¡¡that¡¡you¡¡understand¡¡the¡¡concept¡¡of¡¡marshaling¡¡and¡¡the¡¡fact¡¡that¡¡each¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡medium¡¡will¡¡have¡¡a¡¡different¡¡representation¡¡of¡¡the¡¡type¡£¡¡A¡¡large¡¡part¡¡of¡¡your¡¡programming¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡day¡¡will¡¡involve¡¡moving¡¡data¡¡from¡¡one¡¡stream¡¡to¡¡another¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Some¡¡Things¡¡for¡¡You¡¡to¡¡Do¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡following¡¡are¡¡some¡¡exercises¡¡to¡¡apply¡¡what¡¡you¡¡learned¡¡in¡¡this¡¡chapter¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡1¡£¡¡¡¡In¡¡the¡¡implementation¡¡of¡¡TextProcessor£»¡¡the¡¡display¡¡help¡¡routine¡¡was¡¡not¡¡very¡¡helpful¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Fix¡¡the¡¡implementation¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡2¡£¡¡¡¡There¡¡were¡¡no¡¡testing¡¡routines¡¡for¡¡TextProcessor¡£¡¡Devise¡¡some¡¡realistic¡¡tests¡£¡¡By¡¡realistic¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡tests£»¡¡I¡¡mean¡¡tests¡¡that¡¡don¡¯t¡¡just¡¡focus¡¡on¡¡the¡¡class¡¡library¡¡and¡¡consider¡¡the¡¡application¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡tested¡£¡¡Focus¡¡on¡¡plete¡¡application¡¡tests¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡3¡£¡¡¡¡Having¡¡implemented¡¡the¡¡display¡¡help¡¡routine£»¡¡think¡¡about¡¡whether¡¡or¡¡not¡¡the¡¡imple
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡mentation¡¡is¡¡correct¡£¡¡The¡¡class¡¡Bootstrap¡¡is¡¡a¡¡general¡¡class¡¡that¡¡uses¡¡an¡¡¡¡IProcessor¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡instance£»¡¡which¡¡means¡¡that¡¡different¡¡console¡¡applications¡¡will¡¡process¡¡different¡¡data¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Thus£»¡¡writing¡¡a¡¡general¡¡help¡¡output¡¡might¡¡work£»¡¡but¡¡it¡¡will¡¡not¡¡help¡¡in¡¡resolving¡¡problems¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Fix¡¡the¡¡console¡¡application¡¡TextProcessor¡¡and¡¡¡¡ReaderWriter¡¡project¡¡so¡¡that¡¡the¡¡help¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡message¡¡is¡¡both¡¡specific¡¡and¡¡general¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡4¡£¡¡¡¡In¡¡the¡¡Bootstrap¡¡class£»¡¡when¡¡the¡¡output¡¡was¡¡redirected¡¡to¡¡a¡¡file¡¡£¨as¡¡indicated¡¡by¡¡the¡¡¡¡¡out¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡argument£©£»¡¡there¡¡was¡¡no¡¡check¡¡on¡¡whether¡¡or¡¡not¡¡the¡¡file¡¡exists¡£¡¡Extend¡¡the¡¡Bootstrap¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡class¡¡to¡¡include¡¡an¡¡additional¡¡mand¡line¡¡argument¡¡that¡¡verifies¡¡if¡¡it¡¡is¡¡fine¡¡to¡¡overwrite¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡output¡¡file¡¡if¡¡it¡¡exists¡£¡¡If¡¡an¡¡output¡¡file¡¡does¡¡exist¡¡and¡¡there¡¡is¡¡no¡¡explicit¡¡overwriting£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡generate¡¡an¡¡error¡¡and¡¡stop¡¡processing¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡5¡£¡¡¡¡The¡¡code¡¡in¡¡the¡¡final¡¡solution¡¡for¡¡IProcessor¡£Process£¨£©¡¡has¡¡been¡¡identified¡¡as¡¡being¡¡hard¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡to¡¡maintain¡¡because¡¡the¡¡code¡¡to¡¡check¡¡for¡¡duplicate¡¡dates¡¡is¡¡scattered¡¡throughout¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡method¡£¡¡Rewrite¡¡the¡¡method¡¡implementation¡¡so¡¡that¡¡the¡¡code¡¡is¡¡logical¡¡and¡¡maintainable¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡307¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
C¡¡¡¡H¡¡¡¡A¡¡¡¡P¡¡¡¡T¡¡¡¡E¡¡¡¡R¡¡¡¡¡¡¡¡¡¡1¡¡¡¡1¡¡
¡ö¡¡¡ö¡¡¡ö¡¡
Learning¡¡About¡¡¡¡Generics¡¡
Chapter¡¡9¡¡explained¡¡how¡¡to¡¡use¡¡lists£»¡¡delegates£»¡¡and¡¡lambda¡¡expressions¡£¡¡In¡¡that¡¡chapter£»¡¡you¡¡¡¡
also¡¡saw¡¡an¡¡example¡¡of¡¡¡¡generics¡¡when¡¡using¡¡lists¡¡to¡¡manage¡¡a¡¡collection¡¡of¡¡object¡¡instances¡£¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡main¡¡focus¡¡of¡¡this¡¡chapter¡¡is¡¡¡¡generics¡¡and¡¡how¡¡to¡¡use¡¡them¡¡in¡¡a¡¡black¡¡box¡¡context¡¡¡¡
£¨the¡¡code¡¡doesn¡¯t¡¡know¡¡the¡¡specifics¡¡of¡¡the¡¡¡¡generics¡¡parameter¡¡types£©¡£¡¡The¡¡secondary¡¡¡¡
focus¡¡is¡¡an¡¡implementation¡¡of¡¡lambda¡¡expressions¡¡using¡¡a¡¡spreadsheet¡£¡¡The¡¡idea¡¡is¡¡to¡¡get¡¡you¡¡¡¡
well¡¡versed¡¡in¡¡¡¡generics¡¡and¡¡lambda¡¡expressions£»¡¡which¡¡you¡¡will¡¡likely¡¡use¡¡in¡¡your¡¡own¡¡¡¡
production¡¡code£»¡¡so¡¡that¡¡that¡¡there¡¡will¡¡be¡¡no¡¡surprises¡¡in¡¡your¡¡projects¡£¡¡¡¡
Why¡¡Use¡¡¡¡Generics£¿¡¡
Here¡¯s¡¡a¡¡surprise¡¡for¡¡you£º¡¡there¡¡is¡¡no¡¡imperative¡¡need¡¡for¡¡¡¡generics£»¡¡so¡¡you¡¡could¡¡skip¡¡this¡¡¡¡
chapter¡¡and¡¡read¡¡the¡¡next¡¡one£»¡¡right£¿¡¡Wrong¡£¡¡I¡¡could¡¡just¡¡as¡¡easily¡¡have¡¡said¡¡there¡¡is¡¡no¡¡need¡¡for¡¡¡¡
Visual¡¡Basic¡¡properties£»¡¡nor¡¡any¡¡other¡¡Visual¡¡Basic¡¡construct¡¡that¡¡enriches¡¡your¡¡programming¡¡¡¡
abilities¡£¡¡The¡¡reasons¡¡we¡¡have¡¡Visual¡¡Basic¡¡properties¡¡and¡¡¡¡generics¡¡are¡¡programming¡¡¡¡
elegance¡¡and¡¡expressiveness¡£¡¡
¡¡¡¡¡¡¡¡¡¡To¡¡understand¡¡what¡¡I¡¡am¡¡trying¡¡to¡¡get¡¡at£»¡¡consider¡¡this¡¡sentence£º¡¡
¡¡¡¡¡¡¡¡¡¡Ducks¡¡walk¡¡flat¡¡feet¡¡quack¡¡loud¡¡
¡¡¡¡¡¡¡¡¡¡Reading¡¡the¡¡sentence£»¡¡you¡¡get¡¡an¡¡idea¡¡of¡¡what¡¡is¡¡being¡¡said£»¡¡but¡¡you¡¡are¡¡not¡¡pletely¡¡¡¡
sure¡£¡¡Visual¡¡Basic¡¡without¡¡¡¡generics¡¡is¡¡like¡¡this¡¡sentence£»¡¡in¡¡that¡¡you¡¡express¡¡your¡¡ideas¡¡in¡¡¡¡
code£»¡¡but¡¡some¡¡things¡¡are¡¡not¡¡as¡¡clear¡¡as¡¡you¡¡would¡¡like¡£¡¡
¡¡¡¡¡¡¡¡¡¡Visual¡¡Basic¡¡with¡¡¡¡generics¡¡is¡¡like¡¡this¡¡sentence£º¡¡
¡¡¡¡¡¡¡¡¡¡Ducks¡¡walk¡¡in¡¡a¡¡funny¡¡manner¡¡due¡¡to¡¡their¡¡flat¡¡feet£»¡¡and¡¡when¡¡they¡¡quack£»¡¡it¡¡is¡¡very¡¡
¡¡¡¡¡¡¡¡¡¡loud¡£¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡sentence¡¡is¡¡clearer¡¡and¡¡uses¡¡more¡¡words¡¡to¡¡describe¡¡the¡¡same¡¡thing¡£¡¡The¡¡reason¡¡we¡¡¡¡
talk¡¡using¡¡a¡¡more¡¡sophisticated¡¡language¡¡is¡¡that¡¡we¡¡want¡¡to¡¡explain¡¡concepts¡¡and¡¡be¡¡under
stood¡£¡¡If¡¡you¡¡accept¡¡that£»¡¡then¡¡you¡¡can¡¡accept¡¡why¡¡there¡¡is¡¡a¡¡need¡¡and¡¡context¡¡for¡¡¡¡generics¡£¡¡¡¡
And¡¡if¡¡not£»¡¡feel¡¡free¡¡to¡¡skip¡¡this¡¡chapter¡¡and¡¡read¡¡the¡¡next¡¡one¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡An¡¡example¡¡that¡¡illustrates¡¡how¡¡using¡¡¡¡generics¡¡makes¡¡your¡¡code¡¡clearer£»¡¡as¡¡well¡¡as¡¡¡¡
more¡¡concise£»¡¡than¡¡code¡¡that¡¡does¡¡not¡¡use¡¡¡¡generics¡¡is¡¡a¡¡container¡£¡¡A¡¡¡¡container¡¡is¡¡a¡¡type¡¡¡¡
that¡¡is¡¡used¡¡to¡¡manage¡¡other¡¡types£»¡¡lists¡¡and¡¡collections¡¡are¡¡examples¡¡of¡¡containers¡£¡¡To¡¡keep¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡285¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡308¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
286¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡1¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡¡£¡¡N¡¡E¡¡T¡¡¡¡G¡¡E¡¡N¡¡E¡¡R¡¡I¡¡CS¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡things¡¡simple£»¡¡let¡¯s¡¡look¡¡at¡¡a¡¡container¡¡that¡¡manages¡¡a¡¡single¡¡reference¡£¡¡The¡¡following¡¡is¡¡the¡¡less¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡concise¡¡version¡¡that¡¡uses¡¡the¡¡Object¡¡type¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Class¡¡Container¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Private¡¡_managed¡¡As¡¡Object¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨ByVal¡¡toManage¡¡As¡¡Object£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_managed¡¡=¡¡toManage¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡ReadOnly¡¡Property¡¡Managed£¨£©¡¡As¡¡Object¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Get¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡_managed¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Get¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Property¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡code£»¡¡the¡¡class¡¡Container¡¡has¡¡a¡¡constructor¡¡with¡¡a¡¡parameter¡¡and¡¡a¡¡single¡¡property£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Managed£»¡¡which¡¡references¡¡the¡¡variable¡¡_managed¡£¡¡The¡¡idea¡¡behind¡¡this¡¡class¡¡is¡¡to¡¡assign¡¡an¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡object¡¡in¡¡the¡¡constructor¡¡that¡¡can¡¡be¡¡referenced¡¡using¡¡the¡¡property¡£¡¡The¡¡class¡¡Container¡¡does¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡not¡¡know¡¡what¡¡the¡¡variable¡¡_managed¡¡does¡¡or¡¡its¡¡capabilities¡£¡¡Container¡¡does¡¡not¡¡care£»¡¡because¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Container¡¡is¡¡acting¡¡like¡¡a¡¡basket¡¡that¡¡holds¡¡an¡¡instance¡¡of¡¡whatever¡¡is¡¡given¡¡to¡¡it¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡Container¡¡class¡¡could¡¡be¡¡used¡¡as¡¡follows£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡container¡¡As¡¡Container¡¡=¡¡New¡¡Container£¨New¡¡MyType£¨£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡TryCast£¨container¡£Managed£»¡¡MyType£©¡£Method£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡When¡¡Container¡¡is¡¡instantiated£»¡¡the¡¡_managed¡¡data¡¡member¡¡is¡¡assigned¡¡an¡¡instance¡¡of¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡MyType¡£¡¡MyType¡¡is¡¡a¡¡type¡¡that¡¡is¡¡used¡¡for¡¡illustrative¡¡purposes¡¡and¡¡has¡¡a¡¡single¡¡method£»¡¡Method£¨£©¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡To¡¡retrieve¡¡and¡¡use¡¡the¡¡managed¡¡type£»¡¡the¡¡property¡¡Managed¡¡is¡¡referenced¡£¡¡However£»¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡method¡¡Method£¨£©¡¡cannot¡¡be¡¡called¡¡directly¡¡because¡¡the¡¡property¡¡Managed¡¡is¡¡of¡¡type¡¡Object£»¡¡and¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡thus¡¡you¡¡need¡¡to¡¡cast¡¡the¡¡property¡¡to¡¡type¡¡MyType¡¡so¡¡that¡¡the¡¡call¡¡to¡¡Method£¨£©¡¡is¡¡legal¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡cast¡¡using¡¡TryCast¡¡will¡¡result¡¡in¡¡a¡¡valid¡¡instance¡¡of¡¡MyType¡¡or¡¡a¡¡Nothing¡¡value£»¡¡resulting¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡in¡¡a¡¡null¡¡object¡¡reference¡¡exception¡£¡¡Here¡¯s¡¡a¡¡safe¡¡way¡¡of¡¡using¡¡the¡¡Managed¡¡property£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡container¡¡As¡¡Container¡¡=¡¡New¡¡Container£¨New¡¡MyType£¨£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡TypeOf¡¡container¡£Managed¡¡Is¡¡MyType¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡TryCast£¨container¡£Managed£»¡¡MyType£©¡£Method£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡If¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡bolded¡¡code¡¡is¡¡the¡¡addition¡¡of¡¡the¡¡If¡¡block¡¡to¡¡test¡¡whether¡¡the¡¡container¡¡references¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡type¡¡MyType¡£¡¡Not¡¡shown¡¡is¡¡what¡¡the¡¡code¡¡should¡¡do¡¡if¡¡the¡¡property¡¡Managed¡¡is¡¡not¡¡MyType¡£¡¡The¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡fact¡¡that¡¡you¡¡need¡¡to¡¡verify¡¡that¡¡the¡¡container¡¡references¡¡the¡¡correct¡¡type£»¡¡and¡¡you¡¡also¡¡need¡¡to¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡think¡¡of¡¡an¡¡alternative¡¡plan¡¡if¡¡the¡¡type¡¡is¡¡incorrect£»¡¡adds¡¡quite¡¡a¡¡bit¡¡of¡¡code¡£¡¡It¡¯s¡¡like¡¡that¡¡sentence¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡about¡¡the¡¡duck¡ªsure£»¡¡you¡¡get¡¡the¡¡general¡¡idea¡¡of¡¡what¡¡is¡¡being¡¡said£»¡¡but¡¡are¡¡you¡¡100£¥¡¡sure¡¡of¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡meaning£¿¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡309¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡1¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡IN¡¡G¡¡¡¡¡¡AB¡¡O¡¡U¡¡T¡¡¡¡¡¡¡£¡¡N¡¡E¡¡T¡¡¡¡G¡¡E¡¡N¡¡E¡¡R¡¡I¡¡CS¡¡287¡¡
¡¡¡¡¡¡¡¡¡¡Now¡¡look¡¡at¡¡the¡¡following¡¡code£»¡¡which¡¡implements¡¡a¡¡container¡¡using¡¡¡¡generics¡£¡¡
¡¡¡¡¡¡¡¡Public¡¡Class¡¡GenericsContainer£¨Of¡¡ManagedType£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Private¡¡_managed¡¡As¡¡ManagedType¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨ByVal¡¡toManage¡¡As¡¡ManagedType£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_managed¡¡=¡¡toManage¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡ReadOnly¡¡Property¡¡Managed£¨£©¡¡As¡¡ManagedType¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Get¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡_managed¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Get¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Property¡¡
¡¡¡¡¡¡¡¡End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡You¡¡can¡¡write¡¡code¡¡that¡¡uses¡¡¡¡generics¡¡and¡¡code¡¡that¡¡provides¡¡types¡¡based¡¡on¡¡¡¡¡¡
generics¡£¡¡The¡¡definition¡¡of¡¡GenericsContainer¡¡demonstrates¡¡code¡¡that¡¡provides¡¡types¡¡based¡¡on¡¡¡¡
¡¡generics¡£¡¡You¡¯ll¡¡see¡¡the¡¡code¡¡that¡¡uses¡¡¡¡generics¡¡next¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡generics¡¡parameters¡¡are¡¡associated¡¡with¡¡types£»¡¡such¡¡as¡¡classes¡¡and¡¡interfaces£»¡¡or¡¡with¡¡¡¡
methods¡£¡¡In¡¡the¡¡case¡¡of¡¡GenericsContainer£»¡¡the¡¡¡¡generics¡¡parameter¡¡ManagedType¡¡is¡¡a¡¡¡¡
placeholder¡¡for¡¡an¡¡actual¡¡type¡£¡¡
¡öNote¡¡¡¡monly£»¡¡developers¡¡use¡¡the¡¡notation¡¡of¡¡a¡¡single¡¡letter¡¡when¡¡defining¡¡a¡¡¡¡generics¡¡parameter¡£¡¡¡¡
I¡¡am¡¡not¡¡a¡¡fan¡¡of¡¡that¡¡notation£»¡¡because¡¡it¡¡tells¡¡me¡¡nothing£»¡¡especially¡¡when¡¡there¡¡are¡¡multiple¡¡parameters¡£¡¡I¡¡¡¡
remend¡¡using¡¡an¡¡identifier¡¡that¡¡describes¡¡what¡¡the¡¡parameter¡¡does£»¡¡appended¡¡with¡¡the¡¡word¡¡Type£»¡¡to¡¡¡¡
indicate¡¡a¡¡¡¡generics¡¡parameter¡¡is¡¡being¡¡defined¡£¡¡
¡¡¡¡¡¡¡¡¡¡With¡¡GenericsContainer£»¡¡ManagedType¡¡is¡¡used¡¡as¡¡an¡¡identifier¡¡in¡¡the¡¡place¡¡of¡¡the¡¡identifier¡¡¡¡
object¡¡in¡¡the¡¡type¡¡Container¡£¡¡This¡¡is¡¡a¡¡rule¡¡of¡¡thumb¡£¡¡Whenever¡¡you¡¡find¡¡yourself¡¡using¡¡an¡¡object¡¡¡¡
generically¡¡to¡¡define¡¡a¡¡type£»¡¡you¡¡probably¡¡could¡¡use¡¡¡¡generics¡£¡¡Think¡¡of¡¡¡¡generics¡¡¡¡
types¡¡as¡¡general¡¡things¡£¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡following¡¡code¡¡demonstrates¡¡how¡¡to¡¡use¡¡Gener
¿ì½Ý²Ù×÷: °´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·ҳ °´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ °´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿!
ÎÂÜ°Ìáʾ£º ο´Ð¡ËµµÄͬʱ·¢±íÆÀÂÛ£¬Ëµ³ö×Ô¼ºµÄ¿´·¨ºÍÆäËüС»ï°éÃÇ·ÖÏíÒ²²»´íŶ£¡·¢±íÊéÆÀ»¹¿ÉÒÔ»ñµÃ»ý·ÖºÍ¾Ñé½±Àø£¬ÈÏÕæдԴ´ÊéÆÀ ±»²ÉÄÉΪ¾«ÆÀ¿ÉÒÔ»ñµÃ´óÁ¿½ð±Ò¡¢»ý·ÖºÍ¾Ñé½±ÀøŶ£¡