VB2008´ÓÈëÃŵ½¾«Í¨(PDF¸ñʽӢÎÄ°æ)-µÚ80²¿·Ö
°´¼üÅÌÉÏ·½Ïò¼ü ¡û »ò ¡ú ¿É¿ìËÙÉÏÏ·ҳ£¬°´¼üÅÌÉ쵀 Enter ¼ü¿É»Øµ½±¾ÊéĿ¼ҳ£¬°´¼üÅÌÉÏ·½Ïò¼ü ¡ü ¿É»Øµ½±¾Ò³¶¥²¿£¡
¡ª¡ª¡ª¡ªÎ´ÔĶÁÍꣿ¼ÓÈëÊéÇ©ÒѱãÏ´μÌÐøÔĶÁ£¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡In¡¡the¡¡example£»¡¡_networkIdentifier¡¡will¡¡not¡¡be¡¡written¡¡or¡¡read¡¡from¡¡the¡¡data¡¡stream¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Separating¡¡Data¡¡Objects¡¡from¡¡Action¡¡Objects¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Another¡¡approach¡¡is¡¡to¡¡develop¡¡a¡¡number¡¡of¡¡data¡¡objects¡¡whose¡¡only¡¡role¡¡is¡¡to¡¡be¡¡used¡¡in¡¡seri
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡alization¡¡and¡¡data¡¡referencing¡£¡¡Such¡¡an¡¡approach¡¡is¡¡useful¡¡when¡¡using¡¡binary¡¡serialization£»¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡because¡¡you¡¡are¡¡then¡¡able¡¡to¡¡more¡¡effectively¡¡manage¡¡the¡¡version¡¡problem¡£¡¡The¡¡following¡¡is¡¡an¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡example¡¡of¡¡how¡¡such¡¡an¡¡architecture¡¡would¡¡be¡¡realized¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡301¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡A¡¡PT¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡O¡¡U¡¡T¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡T¡¡E¡¡N¡¡CE¡¡279¡¡
¡¡
Class¡¡MyObject2¡¡
End¡¡Class¡¡
Class¡¡Doer¡¡
¡¡¡¡¡¡¡¡Private¡¡_object¡¡As¡¡MyObject2¡¡
¡¡¡¡¡¡¡¡Private¡¡_networkIdentifier¡¡As¡¡Integer¡¡
End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡class¡¡Doer¡¡has¡¡no¡¡serialization¡¡attribute¡¡and¡¡will¡¡not¡¡be¡¡serialized£»¡¡but¡¡it¡¡references¡¡¡¡
MyObject2¡£¡¡The¡¡network¡¡identifier¡¡data¡¡member¡¡has¡¡been¡¡moved¡¡from¡¡MyObject2¡¡to¡¡Doer¡£¡¡The¡¡¡¡
result¡¡is¡¡that¡¡MyObject2¡¡contains¡¡nothing¡¡that¡¡is¡¡transient¡£¡¡
pleting¡¡Custom¡¡Types¡¡
When¡¡writing¡¡custom¡¡types£»¡¡two¡¡methods¡¡are¡¡often¡¡implemented£»¡¡especially¡¡where¡¡objects¡¡are¡¡¡¡
to¡¡be¡¡pared¡¡a¡¡lot£º¡¡¡¡Equals£¨£©¡¡and¡¡GetHashCode£¨£©¡£¡¡These¡¡two¡¡methods¡¡are¡¡used¡¡by¡¡the¡¡¡¡¡¡
library¡¡API¡¡when¡¡paring¡¡and¡¡manipulating¡¡instances¡¡in¡¡a¡¡list¡¡or¡¡a¡¡collection¡£¡¡It¡¡just¡¡happened¡¡¡¡
in¡¡this¡¡chapter¡¯s¡¡example¡¡that¡¡a¡¡list¡¡of¡¡string¡¡types¡¡did¡¡the¡¡right¡¡thing¡£¡¡If¡¡TextProcessor¡¡had¡¡used¡¡¡¡
the¡¡Ticket¡¡type£»¡¡then¡¡the¡¡Equals£¨£©¡¡method¡¡of¡¡the¡¡list¡¡used¡¡to¡¡find¡¡date¡¡duplicates¡¡would¡¡not¡¡have¡¡¡¡
worked¡£¡¡The¡¡default¡¡implementations¡¡of¡¡¡¡Equals£¨£©¡¡and¡¡GetHashCode£¨£©¡¡are¡¡not¡¡implemented¡¡¡¡
properly¡£¡¡This¡¡is¡¡not¡¡the¡¡¡¡API¡¯s¡¡fault¡£¡¡Rather£»¡¡it¡¡is¡¡a¡¡recognition¡¡that¡¡Microsoft¡¡cannot¡¡know¡¡¡¡
the¡¡structure¡¡of¡¡an¡¡object¡¡and¡¡what¡¡is¡¡considered¡¡as¡¡making¡¡a¡¡type¡¡unique¡£¡¡
Implementing¡¡GetHashCode£¨£©¡¡
The¡¡MSDN¡¡documentation¡¡for¡¡Object¡£GetHashCode¡¡defines¡¡the¡¡GetHashCode£¨£©¡¡method¡¡as¡¡follows¡¡¡¡
£¨http£º//msdn2¡£microsoft¡£/en¡us/library/system¡£object¡£gethashcode£¨VS¡£90£©¡£aspx£©£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡The¡¡GetHashCode¡¡method¡¡can¡¡be¡¡overridden¡¡by¡¡a¡¡derived¡¡type¡£¡¡Value¡¡types¡¡must¡¡over
¡¡¡¡¡¡¡¡¡¡¡¡ride¡¡this¡¡¡¡method¡¡to¡¡¡¡provide¡¡¡¡a¡¡¡¡hash¡¡¡¡function¡¡¡¡that¡¡¡¡is¡¡¡¡appropriate¡¡¡¡for¡¡that¡¡type¡¡¡¡and¡¡to¡¡
¡¡¡¡¡¡¡¡¡¡provide¡¡a¡¡useful¡¡distribution¡¡in¡¡¡¡a¡¡hash¡¡table¡£¡¡For¡¡¡¡best¡¡results£»¡¡the¡¡hash¡¡code¡¡must¡¡be¡¡
¡¡¡¡¡¡¡¡¡¡based¡¡on¡¡the¡¡value¡¡of¡¡an¡¡instance¡¡field¡¡or¡¡property¡¡instead¡¡of¡¡a¡¡static¡¡field¡¡or¡¡property¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡Objects¡¡used¡¡as¡¡a¡¡key¡¡in¡¡a¡¡Hashtable¡¡object¡¡must¡¡also¡¡override¡¡the¡¡GetHashCode¡¡method¡¡
¡¡¡¡¡¡¡¡¡¡because¡¡those¡¡objects¡¡must¡¡generate¡¡their¡¡own¡¡hash¡¡code¡£¡¡If¡¡an¡¡object¡¡used¡¡as¡¡a¡¡key¡¡does¡¡
¡¡¡¡¡¡¡¡¡¡¡¡not¡¡¡¡provide¡¡¡¡a¡¡¡¡useful¡¡¡¡implementation¡¡¡¡of¡¡¡¡GetHashCode£»¡¡¡¡you¡¡¡¡can¡¡¡¡specify¡¡¡¡a¡¡¡¡hash¡¡¡¡code¡¡
¡¡¡¡¡¡¡¡¡¡provider¡¡when¡¡the¡¡Hashtable¡¡object¡¡is¡¡constructed¡£¡¡
¡¡¡¡¡¡¡¡¡¡But¡¡what¡¡does¡¡this¡¡actually¡¡mean£¿¡¡The¡¡purpose¡¡of¡¡GetHashCode£¨£©¡¡is¡¡to¡¡identify¡¡the¡¡object¡¡in¡¡¡¡
a¡¡collection¡¡of¡¡other¡¡objects¡¡using¡¡a¡¡hash¡¡code¡£¡¡Imagine¡¡creating¡¡a¡¡table¡¡of¡¡same¡type¡¡instances¡£¡¡¡¡
The¡¡situation¡¡occurs¡¡when¡¡you¡¡create¡¡a¡¡collection¡¡and¡¡store¡¡a¡¡bunch¡¡of¡¡instances¡¡in¡¡the¡¡collec
tion¡£¡¡With¡¡the¡¡GetHashCode£¨£©¡¡method£»¡¡you¡¡can¡¡generally¡¡separate¡¡each¡¡instance¡¡from¡¡each¡¡other¡£¡¡¡¡
I¡¡say¡¡¡°generally¡±¡¡because¡¡GetHashCode£¨£©¡¡is¡¡an¡¡approximation¡£¡¡To¡¡verify¡¡if¡¡one¡¡object¡¡instance¡¡¡¡
equals¡¡another£»¡¡the¡¡Equals£¨£©¡¡method¡¡needs¡¡to¡¡be¡¡implemented¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡302¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
280¡¡¡¡¡¡¡¡¡¡¡¡¡¡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¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Implementing¡¡a¡¡hash¡¡code¡¡is¡¡best¡¡delegated¡¡to¡¡a¡¡helper¡¡class¡¡that¡¡does¡¡the¡¡heavy¡¡lifting¡£¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡book¡¡Effective¡¡Java¡¡Programming¡¡Language¡¡Guide¡¡by¡¡Joshua¡¡Bloch¡¡£¨Prentice¡Hall£»¡¡2001£©¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡outlines¡¡a¡¡robust¡¡technique¡£¡¡Basically£»¡¡you¡¡store¡¡some¡¡constant¡¡nonzero¡¡value£»¡¡such¡¡as¡¡17£»¡¡in¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡variable¡£¡¡Then£»¡¡for¡¡each¡¡data¡¡member¡¡of¡¡the¡¡type£»¡¡perform¡¡a¡¡mathematical¡¡operation¡¡that¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡results¡¡in¡¡Integer¡¡values¡¡that¡¡are¡¡successively¡¡multiplied¡¡and¡¡added£»¡¡where¡¡the¡¡operation¡¡is¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡specific¡¡to¡¡the¡¡type¡¡and¡¡defined¡¡as¡¡follows£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡Boolean£º¡¡If¡¡true¡¡return¡¡0£»¡¡otherwise¡¡return¡¡1¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡Byte£»¡¡Char£»¡¡Short£»¡¡or¡¡Integer£º¡¡Return¡¡the¡¡value¡¡of¡¡the¡¡type¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡Long£º¡¡Return¡¡CInt£¨value¡¡Xor¡¡£¨value¡¡¡·¡·¡¡&H20£©£©¡£¡¡&H20¡¡is¡¡the¡¡hexadecimal¡¡for¡¡32¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Single£º¡¡Return¡¡Convert¡£ToInt32¡¡of¡¡the¡¡value¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡¡¡Object£º¡¡Return¡¡the¡¡value¡¡generated¡¡by¡¡calling¡¡Object¡£GetHashCode£¨£©¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡o¡¡Array¡¡£º¡¡Iterate¡¡and¡¡treat¡¡each¡¡element¡¡individually¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡rules¡¡are¡¡implemented¡¡in¡¡a¡¡class¡¡called¡¡HashCodeAutomater¡£¡¡The¡¡following¡¡source¡¡code¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡is¡¡an¡¡implementation¡¡in¡¡an¡¡abbreviated¡¡form£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Class¡¡HashCodeAutomater¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Private¡¡Readonly¡¡_constant¡¡As¡¡Integer¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Private¡¡_runningTotal¡¡As¡¡Integer¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_constant¡¡=¡¡&H25¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_runningTotal¡¡=¡¡&H11¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Function¡¡AppendSuper£¨ByVal¡¡superHashCode¡¡As¡¡Integer£©¡¡As¡¡HashCodeAutomater¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡_runningTotal¡¡=¡¡£¨£¨_runningTotal¡¡*¡¡_constant£©¡¡£«¡¡superHashCode£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡Me¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Function¡¡Append£¨ByVal¡¡obj¡¡As¡¡Object£©¡¡As¡¡HashCodeAutomater¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡£¨obj¡¡Is¡¡Nothing£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£_runningTotal¡¡=¡¡£¨Me¡£_runningTotal¡¡*¡¡Me¡£_constant£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ElseIf¡¡Not¡¡obj¡£GetType¡£IsArray¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£_runningTotal¡¡=¡¡£¨£¨Me¡£_runningTotal¡¡*¡¡Me¡£_constant£©¡¡£«¡¡obj¡£GetHashCode£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ElseIf¡¡TypeOf¡¡obj¡¡Is¡¡Long£¨£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£Append£¨DirectCast£¨obj£»¡¡Long£¨£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ElseIf¡¡TypeOf¡¡obj¡¡Is¡¡Integer£¨£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£Append£¨DirectCast£¨obj£»¡¡Integer£¨£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ElseIf¡¡TypeOf¡¡obj¡¡Is¡¡Short£¨£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£Append£¨DirectCast£¨obj£»¡¡Short£¨£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ElseIf¡¡TypeOf¡¡obj¡¡Is¡¡Char£¨£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£Append£¨DirectCast£¨obj£»¡¡Char£¨£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡303¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡CH¡¡A¡¡PT¡¡E¡¡R¡¡¡¡¡¡1¡¡0¡¡¡¡¡¡¡ö¡¡¡¡¡¡¡¡L¡¡E¡¡A¡¡R¡¡N¡¡I¡¡N¡¡G¡¡¡¡¡¡A¡¡B¡¡O¡¡U¡¡T¡¡¡¡P¡¡E¡¡R¡¡S¡¡IS¡¡T¡¡E¡¡N¡¡CE¡¡281¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ElseIf¡¡TypeOf¡¡obj¡¡Is¡¡Byte£¨£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£Append£¨DirectCast£¨obj£»¡¡Byte£¨£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ElseIf¡¡TypeOf¡¡obj¡¡Is¡¡Double£¨£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£Append£¨DirectCast£¨obj£»¡¡Double£¨£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ElseIf¡¡TypeOf¡¡obj¡¡Is¡¡Single£¨£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£Append£¨DirectCast£¨obj£»¡¡Single£¨£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ElseIf¡¡TypeOf¡¡obj¡¡Is¡¡Boolean£¨£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£Append£¨DirectCast£¨obj£»¡¡Boolean£¨£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Else¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£Append£¨DirectCast£¨obj£»¡¡Object£¨£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡If¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡Me¡¡
¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡Public¡¡Function¡¡Append£¨ByVal¡¡array¡¡As¡¡Long£¨£©£©¡¡As¡¡HashCodeAutomater¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡£¨array¡¡Is¡¡Nothing£©¡¡Then¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£_runningTotal¡¡=¡¡£¨Me¡£_runningTotal¡¡*¡¡Me¡£_constant£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Else¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Dim¡¡i¡¡As¡¡Integer¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡For¡¡i¡¡=¡¡0¡¡To¡¡array¡£Length¡¡1¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£Append£¨array£¨i£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Next¡¡i¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡If¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡Me¡¡
¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡Public¡¡Function¡¡Append£¨ByVal¡¡value¡¡As¡¡Long£©¡¡As¡¡HashCodeAutomater¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Me¡£_runningTotal¡¡=¡¡_¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£¨£¨Me¡£_runningTotal¡¡*¡¡Me¡£_constant£©¡¡£«¡¡CInt£¨£¨value¡¡Xor¡¡£¨value¡¡¡·¡·¡¡&H20£©£©£©£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡Me¡¡
¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡Public¡¡Function¡¡ToHashCode£¨£©¡¡As¡¡Integer¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡_runningTotal¡¡
¡¡¡¡¡¡¡¡End¡¡Function¡¡
End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡The¡¡different¡¡implementations¡¡of¡¡the¡¡Append£¨£©¡¡method¡¡belong¡¡to¡¡a¡¡single¡¡grouping¡¡for¡¡a¡¡¡¡
single¡¡data¡¡type£»¡¡Long¡£¡¡For¡¡example£»¡¡there¡¡is¡¡an¡¡Append£¨£©¡¡method¡¡that¡¡accepts¡¡a¡¡¡¡Long¡¡and¡¡a¡¡¡¡Long¡¡¡¡
array¡£¡¡The¡¡full¡¡implementation¡¡of¡¡HashCodeAutomater¡¡would¡¡have¡¡an¡¡Append£¨£©¡¡method¡¡for¡¡Short¡¡¡¡
and¡¡Short¡¡array£»¡¡and¡¡all¡¡the¡¡other¡¡data¡¡types¡£¡¡There¡¡is¡¡no¡¡specific¡¡group¡¡implementation¡¡for¡¡the¡¡¡¡
String¡¡type£»¡¡because¡¡it¡¡is¡¡treated¡¡like¡¡an¡¡object¡¡that¡¡has¡¡its¡¡own¡¡hash¡code¡¡calculation¡¡¡¡
implementation¡£¡¡
¡¡¡¡¡¡¡¡¡¡Notice¡¡in¡¡the¡¡implementations¡¡of¡¡the¡¡Append£¨£©¡¡methods¡¡how¡¡a¡¡calculation¡¡is¡¡performed¡¡¡¡
and¡¡then¡¡added¡¡to¡¡the¡¡data¡¡member¡¡_runningTotal¡£¡¡The¡¡return¡¡value¡¡is¡¡a¡¡Me¡¡reference£»¡¡so¡¡that¡¡¡¡
the¡¡methods¡¡can¡¡be¡¡chained¡¡together¡£¡¡This¡¡allows¡¡a¡¡client¡¡to¡¡use¡¡the¡¡HashCodeAutomater¡¡class£»¡¡¡¡
as¡¡the¡¡following¡¡GetHashCode£¨£©¡¡implementation¡¡demonstrates£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Page¡¡304¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
282¡¡¡¡¡¡¡¡¡¡¡¡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¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Class¡¡HashcodeExample¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡value¡¡As¡¡Integer¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡buffer¡¡As¡¡String¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Sub¡¡New¡¡£¨ByVal¡¡val¡¡As¡¡Integer£»¡¡ByVal¡¡buf¡¡As¡¡String£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡value¡¡=¡¡val¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡buffer¡¡=¡¡buf¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Sub¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Overrides¡¡Function¡¡GetHashCode£¨£©¡¡As¡¡Integer¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Return¡¡New¡¡HashCodeAutomater£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£Append£¨value£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡£Append£¨buffer£©¡£toHashCode£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Function¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡End¡¡Class¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡The¡¡implementation¡¡of¡¡HashcodeExample¡¡has¡¡two¡¡data¡¡members£º¡¡value¡¡and¡¡buffer¡£¡¡The¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡two¡¡data¡¡members¡¡make¡¡up¡¡the¡¡class¡¯s¡¡state¡£¡¡Not¡¡all¡¡data¡¡members¡¡are¡¡used¡¡when¡¡calculating¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡class¡¡instance¡¯s¡¡hash¡code¡¡value¡£¡¡For¡¡example£»¡¡if¡¡HashcodeExample¡¡had¡¡a¡¡data¡¡member¡¡that¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡referenced¡¡a¡¡database¡¡connection£»¡¡it¡¡should¡¡not¡¡be¡¡used¡¡when¡¡calculating¡¡the¡¡hash¡¡code£»¡¡because¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡the¡¡database¡¡connection¡¡is¡¡the¡¡type¡¡used¡¡to¡¡get¡¡the¡¡state¡¡and¡¡does¡¡not¡¡influence¡¡the¡¡state¡ªit¡¡is¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡a¡¡means¡¡to¡¡an¡¡end¡£¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Implementing¡¡Equals£¨£©¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Once¡¡the¡¡GetHashCode£¨£©¡¡method¡¡has¡¡been¡¡implemented£»¡¡the¡¡¡¡Equals£¨£©¡¡method¡¡can¡¡be¡¡¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡implemented£º¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡Public¡¡Overrides¡¡Function¡¡Equals£¨ByVal¡¡obj¡¡As¡¡Object£©¡¡As¡¡Boolean¡¡
¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡If¡¡TypeOf£¨obj£©¡¡Is¡¡HashCodeExample