嗔秤戻幣�哉膵�云利匈嬉蝕湊蛸賜�塋床四衲���萩晦編報炎嘔囚^泡仟 ̄云利匈�《超噌�殻窟�嵌虜隆輓麈觚翹瀘卉韮�仍仍�。� 烏御危列
浪慕利 卦指云慕朕村 厘議慕尺 厘議慕禰 TXT畠云和墮 序秘慕杏 紗秘慕禰

VB2008貫秘壇欺娼宥(PDF鯉塀哂猟井)-及100嫗

梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��






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 HashCodeExam
卦指朕村 貧匯匈 和匯匈 指欺競何 壘��0�� 家��0��
隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
梁椣戻幣�� 梁心弌傍議揖扮窟燕得胎��傍竃徭失議心隈才凪万弌誌育断蛍�輌臆惨軼僑〃�燕慕得珊辛參資誼持蛍才将刮襲潜��範寔亟圻幹慕得 瓜寡追葎娼得辛參資誼寄楚署衛、持蛍才将刮襲潜填��