VB2008´ÓÈëÃŵ½¾«Í¨(PDF¸ñʽӢÎÄ°æ)-µÚ119²¿·Ö
°´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·ҳ£¬°´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ£¬°´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿£¡
¡ª¡ª¡ª¡ªÎ´ÔĶÁÍꣿ¼ÓÈëÊéÇ©ÒѱãÏ´μÌÐøÔĶÁ£¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ular¡¡problem£»¡¡but¡¡not¡¡raise¡¡the¡¡old¡¡problems¡¡of¡¡spaghetti¡¡code¡¡making¡¡a¡¡mess¡¡of¡¡things¡£¡¡So¡¡if¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡you¡¡need¡¡to¡¡use¡¡a¡¡GoTo¡¡statement£»¡¡go¡¡ahead£»¡¡just¡¡don¡¯t¡¡use¡¡it¡¡excessively¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡One¡¡example¡¡where¡¡it¡¡is¡¡not¡¡easily¡¡possible¡¡to¡¡avoid¡¡using¡¡a¡¡GoTo¡¡statement¡¡is¡¡in¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡following¡¡pseudo¡code¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Do¡¡While¡¡FirstActionLoop£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Do¡¡While¡¡SecondActionLoop£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡BreakOutOfLoops£¨£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡GoTo¡¡EXIT_ALL¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡If¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Loop¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Loop¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡EXIT_ALL£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡445¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡6¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡O¡¡TH¡¡E¡¡R¡¡¡¡¡¡V¡¡IS¡¡U¡¡AL¡¡¡¡¡¡B¡¡A¡¡SI¡¡C¡¡¡¡T¡¡E¡¡C¡¡HN¡¡IQ¡¡U¡¡E¡¡S¡¡423¡¡
¡¡¡¡¡¡¡¡¡¡This¡¡code¡¡has¡¡two¡¡loops¡£¡¡If¡¡the¡¡code¡¡is¡¡executing¡¡the¡¡second¡¡loop¡¡and¡¡decides¡¡to¡¡end¡¡pro
cessing£»¡¡then¡¡exiting¡¡the¡¡loop¡¡bees¡¡a¡¡bit¡¡tricky£»¡¡as¡¡you¡¡can¡¡break¡¡execution¡¡only¡¡one¡¡loop¡¡at¡¡a¡¡¡¡
time¡¡using¡¡the¡¡¡¡Exit¡¡Do¡¡statement¡£¡¡Thus£»¡¡one¡¡solution¡¡is¡¡to¡¡use¡¡the¡¡GoTo¡¡statement£»¡¡as¡¡shown¡£¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡GoTo¡¡statement¡¡is¡¡associated¡¡with¡¡an¡¡identifier¡¡that¡¡represents¡¡a¡¡label¡£¡¡The¡¡label¡¡can¡¡be¡¡¡¡
placed¡¡almost¡¡anywhere¡¡in¡¡the¡¡declared¡¡method¡£¡¡An¡¡exception¡¡is¡¡that¡¡you¡¡can¡¯t¡¡place¡¡a¡¡label¡¡in¡¡¡¡
a¡¡Select¡¡statement¡£¡¡However£»¡¡you¡¡can¡¡place¡¡the¡¡label¡¡before¡¡or¡¡after¡¡the¡¡GoTo¡¡keyword¡£¡¡
¡¡Generics¡¡Constraints¡¡
¡¡generics¡¡have¡¡been¡¡covered¡¡in¡¡several¡¡chapters¡£¡¡An¡¡additional¡¡aspect¡¡of¡¡¡¡generics¡¡is¡¡¡¡
constraints£»¡¡which¡¡can¡¡be¡¡optionally¡¡used¡¡to¡¡optimize¡¡programming¡£¡¡Constraints¡¡limit¡¡the¡¡types¡¡¡¡
that¡¡the¡¡parameter¡¡can¡¡be¡£¡¡
¡¡¡¡¡¡¡¡¡¡Three¡¡types¡¡of¡¡constraints¡¡are¡¡Class£»¡¡New£»¡¡and¡¡a¡¡specific¡¡type¡£¡¡As¡¡a¡¡general¡¡rule£»¡¡a¡¡constraint¡¡¡¡
is¡¡added¡¡in¡¡the¡¡form¡¡of¡¡an¡¡As¡¡statement£»¡¡as¡¡follows£º¡¡
Class¡¡Example£¨Of¡¡DataType¡¡As¡¡£ûNew£ý£©¡¡
End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡This¡¡example¡¡limits¡¡DataType¡¡to¡¡types¡¡that¡¡have¡¡a¡¡default¡¡constructor¡£¡¡
Using¡¡the¡¡Type¡¡Constraint¡¡
Type¡¡constraints¡¡allow¡¡you¡¡to¡¡associate¡¡a¡¡minimal¡¡type¡¡with¡¡the¡¡¡¡generics¡¡parameter¡£¡¡For¡¡¡¡
example£»¡¡suppose¡¡this¡¡interface¡¡is¡¡defined£º¡¡
¡¡¡¡¡¡¡¡Interface¡¡IExample¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Sub¡¡Method£¨£©¡¡
¡¡¡¡¡¡¡¡End¡¡Interface¡¡
¡¡¡¡¡¡¡¡¡¡Adding¡¡an¡¡¡¡IExample¡¡constraint¡¡to¡¡the¡¡¡¡generics¡¡parameter¡¡allows¡¡you¡¡to¡¡define¡¡a¡¡class¡¡¡¡
as¡¡follows£º¡¡
Class¡¡ExampleMgr£¨Of¡¡DataType¡¡As¡¡£û¡¡IExample£ý£©¡¡¡¡
¡¡¡¡¡¡¡¡Private¡¡_inst¡¡As¡¡DataType¡¡
¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨ByVal¡¡inst¡¡As¡¡DataType£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_inst¡¡=¡¡inst¡¡
¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡Public¡¡Sub¡¡DoSomething£¨£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_inst¡£Method£¨£©¡¡
¡¡¡¡¡¡¡¡End¡¡Sub¡¡
End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡example£»¡¡the¡¡constraint¡¡of¡¡IExample¡¡allows¡¡a¡¡developer¡¡to¡¡call¡¡Method£¨£©¡£¡¡If¡¡the¡¡constraint¡¡¡¡
were¡¡not¡¡there£»¡¡the¡¡reference¡¡to¡¡Method¡¡would¡¡generate¡¡a¡¡piler¡¡error£»¡¡because¡¡Method£¨£©¡¡is¡¡¡¡
not¡¡a¡¡method¡¡of¡¡DataType¡£¡¡
¡¡¡¡¡¡¡¡¡¡But¡¡is¡¡this¡¡ability¡¡to¡¡reference¡¡a¡¡method¡¡an¡¡advantage£¿¡¡After¡¡all£»¡¡you¡¡could¡¡write¡¡the¡¡¡¡
ExampleMgr¡¡code¡¡without¡¡using¡¡¡¡generics£»¡¡like¡¡this£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡446¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
424¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡6¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡O¡¡TH¡¡E¡¡R¡¡¡¡¡¡V¡¡IS¡¡U¡¡AL¡¡¡¡¡¡B¡¡A¡¡SI¡¡C¡¡¡¡TE¡¡C¡¡H¡¡N¡¡IQ¡¡U¡¡E¡¡S¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Class¡¡ExampleMgr¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡_inst¡¡As¡¡IExample¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨ByVal¡¡inst¡¡As¡¡IExample£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£_inst¡¡=¡¡inst¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡DoSomething£¨£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_inst¡£Method£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡¡¡generics¡¡code¡¡and¡¡the¡¡interface¡based¡¡code¡¡do¡¡the¡¡exact¡¡same¡¡thing£»¡¡and¡¡using¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡generics¡¡offers¡¡no¡¡advantage¡¡in¡¡this¡¡example¡£¡¡But¡¡that¡¡is¡¡not¡¡always¡¡the¡¡case¡£¡¡Consider¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡following¡¡modified¡¡example¡¡of¡¡¡¡ExampleMgr¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Class¡¡ExampleMgr£¨Of¡¡DataType¡¡As¡¡£û¡¡IExample¡¡£ý£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡_inst¡¡As¡¡DataType¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨ByVal¡¡inst¡¡As¡¡IExample£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£_inst¡¡=¡¡CType£¨inst£»¡¡DataType£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡DoSomething£¨£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_inst¡£Method£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡ReadOnly¡¡Property¡¡Inst£¨£©¡¡As¡¡DataType¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Get¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡_inst¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Get¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Property¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡With¡¡¡¡generics£»¡¡you¡¡can¡¡write¡¡a¡¡property¡¡that¡¡contains¡¡a¡¡reference¡¡to¡¡the¡¡base¡¡type¡£¡¡Had¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡you¡¡used¡¡the¡¡pure¡¡interface¡based¡¡code£»¡¡the¡¡¡¡Inst¡¡property¡¡would¡¡need¡¡to¡¡be¡¡of¡¡type¡¡IExample£»¡¡and¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡to¡¡get¡¡the¡¡same¡¡effect¡¡as¡¡the¡¡¡¡generics¡¡example£»¡¡a¡¡cast¡¡would¡¡be¡¡involved¡£¡¡A¡¡cast¡¡is¡¡not¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡end¡¡of¡¡the¡¡world£»¡¡but¡¡it¡¡is¡¡inconvenient¡¡and¡¡not¡¡type¡safe£»¡¡since¡¡you¡¡don¡¯t¡¡know¡¡if¡¡a¡¡cast¡¡will¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡work¡¡until¡¡you¡¡execute¡¡the¡¡code¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡You¡¡can¡¡add¡¡multiple¡¡interfaces¡¡and¡¡classes¡¡as¡¡constraints£»¡¡although¡¡you¡¡are¡¡limited¡£¡¡The¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡limitations¡¡are¡¡identical¡¡to¡¡the¡¡limitations¡¡when¡¡subclassing¡¡a¡¡class¡¡or¡¡interface£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡You¡¡can¡¡subclass¡¡only¡¡a¡¡single¡¡class¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡You¡¡can¡¡subclass¡¡as¡¡many¡¡interfaces¡¡as¡¡desired£»¡¡but¡¡they¡¡must¡¡be¡¡declared¡¡after¡¡the¡¡class¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡447¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡6¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡O¡¡TH¡¡E¡¡R¡¡¡¡¡¡V¡¡IS¡¡U¡¡AL¡¡¡¡¡¡B¡¡A¡¡SI¡¡C¡¡¡¡T¡¡E¡¡C¡¡HN¡¡IQ¡¡U¡¡E¡¡S¡¡425¡¡
Using¡¡the¡¡New¡¡Constraint¡¡
The¡¡purpose¡¡of¡¡the¡¡New¡¡constraint¡¡is¡¡to¡¡limit¡¡the¡¡data¡¡type¡¡to¡¡one¡¡that¡¡has¡¡a¡¡default¡¡constructor£»¡¡¡¡
as¡¡in¡¡this¡¡example£º¡¡
Class¡¡Example£¨Of¡¡DataType¡¡As¡¡£ûNew£ý£©¡¡¡¡
¡¡¡¡¡¡¡¡Private¡¡_value¡¡As¡¡DataType¡¡
¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_value¡¡=¡¡New¡¡DataType£¨£©¡¡
¡¡¡¡¡¡¡¡End¡¡Sub¡¡
End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡Without¡¡the¡¡¡¡New¡¡constraint£»¡¡the¡¡bolded¡¡code¡¡cannot¡¡be¡¡piled¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡constructor¡¡that¡¡is¡¡defined¡¡with¡¡the¡¡New¡¡constraint¡¡does¡¡not¡¡take¡¡parameters£»¡¡and¡¡it¡¡¡¡
would¡¡seem¡¡that¡¡this¡¡is¡¡a¡¡bother¡£¡¡After¡¡all£»¡¡you¡¡might¡¡want¡¡to¡¡instantiate¡¡the¡¡type¡¡with¡¡some¡¡¡¡
state¡£¡¡What¡¡you¡¡can¡¡do¡¡is¡¡constrain¡¡DataType£»¡¡and¡¡then¡¡instantiate¡¡the¡¡type¡¡using¡¡object¡¡initial
izers¡£¡¡For¡¡example£»¡¡the¡¡following¡¡is¡¡an¡¡interface¡¡that¡¡has¡¡a¡¡single¡¡property¡£¡¡
Interface¡¡IBase¡¡¡¡
¡¡¡¡¡¡¡¡Property¡¡Value£¨£©¡¡As¡¡Integer¡¡
End¡¡Interface¡¡
¡¡¡¡¡¡¡¡¡¡bining¡¡the¡¡IBase¡¡interface¡¡and¡¡the¡¡¡¡New¡¡keyword¡¡as¡¡constraints£»¡¡you¡¡could¡¡write¡¡the¡¡¡¡
following¡¡code¡£¡¡
Class¡¡Example£¨Of¡¡DataType¡¡As¡¡£ûIBase£»¡¡New£ý£©¡¡¡¡
¡¡¡¡¡¡¡¡Private¡¡_value¡¡As¡¡DataType¡¡
¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_value¡¡=¡¡New¡¡DataType£¨£©¡¡With¡¡£û¡£Value¡¡=¡¡10£ý¡¡
¡¡¡¡¡¡¡¡End¡¡Sub¡¡
End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡modified¡¡example£»¡¡the¡¡bolded¡¡code¡¡instantiates¡¡DataType£»¡¡and¡¡then¡¡using¡¡the¡¡¡¡
constraints£»¡¡the¡¡object¡¡initializer¡¡that¡¡defines¡¡_value¡¡is¡¡possible¡£¡¡
Using¡¡the¡¡Class¡¡Constraint¡¡
The¡¡main¡¡purpose¡¡of¡¡the¡¡Class¡¡constraint¡¡is¡¡to¡¡indicate¡¡whether¡¡the¡¡¡¡generics¡¡type¡¡is¡¡a¡¡value¡¡¡¡
type¡¡or¡¡a¡¡reference¡¡type¡£¡¡Here¡¡is¡¡an¡¡example¡¡of¡¡a¡¡type¡¡that¡¡wants¡¡to¡¡manage¡¡only¡¡reference¡¡types£º¡¡
Class¡¡AssumeReferenceType£¨Of¡¡DataType¡¡As¡¡£ûClass£ý£©¡¡
¡¡¡¡¡¡¡¡Private¡¡_value¡¡As¡¡DataType¡¡
¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨ByVal¡¡value¡¡As¡¡DataType£©¡¡¡¡
¡¡¡¡¡¡¡¡End¡¡Sub¡¡
End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡448¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
426¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡6¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡OU¡¡T¡¡¡¡¡¡O¡¡TH¡¡E¡¡R¡¡¡¡¡¡V¡¡IS¡¡U¡¡AL¡¡¡¡¡¡B¡¡A¡¡SI¡¡C¡¡¡¡TE¡¡C¡¡H¡¡N¡¡IQ¡¡U¡¡E¡¡S¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡you¡¡were¡¡to¡¡declare¡¡the¡¡AssumeReferenceType¡¡using¡¡an¡¡Integer£»¡¡as¡¡shown¡¡in¡¡the¡¡following¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡example£»¡¡the¡¡code¡¡would¡¡not¡¡pile¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡cls¡¡As¡¡AssumeReferenceType£¨Of¡¡Integer£©¡¡=¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡New¡¡AssumeReferenceType£¨Of¡¡Integer£©£¨Nothing£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Nullable¡¡Types¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡In¡¡£»¡¡Nothing¡¡means¡¡no¡¡value£»¡¡and¡¡we¡¡all¡¡understand¡¡what¡¡it¡¡represents£»¡¡right£¿¡¡For¡¡example£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡following¡¡code¡¡shows¡¡how¡¡to¡¡use¡¡Nothing¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡value¡¡As¡¡Object¡¡=¡¡Nothing¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡value¡¡Is¡¡Nothing¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Console¡£WriteLine£¨¡¨Yup¡¡a¡¡Nothing¡¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡If¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡example¡¡is¡¡obvious¡¡and¡¡does¡¡nothing¡¡useful¡£¡¡If¡¡you¡¡attempted¡¡to¡¡call¡¡the¡¡Object¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ToString£¨£©¡¡method¡¡on¡¡value£»¡¡an¡¡exception¡¡would¡¡be¡¡generated¡£¡¡So£»¡¡what¡¡the¡¡code¡¡has¡¡created¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡is¡¡a¡¡variable¡¡value¡¡that¡¡references¡¡nothing¡¡and¡¡is¡¡nothing¡£¡¡This¡¡works¡¡because¡¡the¡¡example¡¡uses¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡¡¡reference¡¡type¡£¡¡Let¡¯s¡¡see¡¡what¡¡happens¡¡when¡¡you¡¡assign¡¡a¡¡value¡¡to¡¡a¡¡value¡¡type¡¡that¡¡we¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡equate¡¡to¡¡no¡¡real¡¡value¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡value¡¡As¡¡Integer¡¡=¡¡0¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡value¡¡=¡¡0¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Console¡£WriteLine£¨¡¨Yup¡¡a¡¡Nothing£¿£¿£¿¡¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡If¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡This¡¡time£»¡¡value¡¡is¡¡not¡¡of¡¡the¡¡type¡¡Object£»¡¡but¡¡is¡¡of¡¡the¡¡type¡¡Integer¡£¡¡And¡¡value¡¡is¡¡assigned¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡value¡¡of¡¡0¡¡to¡¡indicate¡¡no¡¡real¡¡value¡£¡¡Now¡¡many¡¡of¡¡you¡¡will¡¡be¡¡saying£»¡¡¡°Hey£»¡¡wait¡¡a¡¡minute¡ª¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡0¡¡¡¡Nothing¡£¡±¡¡Yet£»¡¡in¡¡the¡¡programming¡¡languages¡¡C£«£«¡¡and¡¡C£»¡¡Nothing¡¡and¡¡0¡¡have¡¡the¡¡same¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡contextual¡¡meaning£»¡¡so¡¡it¡¯s¡¡not¡¡so¡¡outlandish¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Visual¡¡Basic¡¡has¡¡a¡¡programming¡¡construct¡¡called¡¡the¡¡nullable¡¡type¡£¡¡The¡¡nullable¡¡type¡¡solves¡¡the¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡problem¡¡of¡¡knowing¡¡whether¡¡or¡¡not¡¡a¡¡value¡¡type¡¡has¡¡been¡¡assigned¡£¡¡This¡¡is¡¡needed¡¡when¡¡inter
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡acting¡¡with¡¡relational¡¡databases¡£¡¡For¡¡example£»¡¡there¡¡is¡¡no¡¡way¡¡to¡¡indicate¡¡that¡¡an¡¡integer¡¡value¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡is¡¡not¡¡assigned£»¡¡since¡¡declaring¡¡a¡¡value¡¡type¡¡means¡¡declaring¡¡a¡¡stack¡¡variable£»¡¡and¡¡it¡¡will¡¡have¡¡a¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡default¡¡value¡£¡¡In¡¡other¡¡words£»¡¡there¡¡is¡¡no¡¡chance¡¡a¡¡value¡¡type¡¡will¡¡have¡¡a¡¡null¡¡reference¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡A¡¡nullable¡¡type¡¡in¡¡Visual¡¡Basic¡¡is¡¡used¡¡to¡¡define¡¡a¡¡value¡type¡¡variable¡¡that¡¡might¡¡have¡¡a¡¡null¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡state¡£¡¡In¡¡the¡¡value¡¡type¡¡example£»¡¡the¡¡integer¡¡value¡¡was¡¡assigned¡¡a¡¡value¡¡of¡¡0£»¡¡but¡¡a¡¡value¡¡of¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Nothing¡¡would¡¡have¡¡been¡¡more¡¡appropriate¡£¡¡However£»¡¡value¡¡types¡¡cannot¡¡be¡¡assigned¡¡a¡¡value¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡of¡¡Nothing£»¡¡they¡¡must¡¡be¡¡assigned¡¡some¡¡valid¡¡value¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡To¡¡further¡¡demonstrate¡¡the¡¡restrictions¡¡of¡¡a¡¡value¡¡type£»¡¡the¡¡following¡¡is¡¡a¡¡Structure¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡declaration¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡449¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡AP¡¡T¡¡E¡¡R¡¡¡¡¡¡1¡¡6¡¡¡¡¡¡¡