10. maj 2011 - 23:05Der er
5 kommentarer og 1 løsning
Spørgsmål vedr. GetHashCode i custom class
Jeg har et spørgsmål som jeg slet ikke kan finde ud af at gribe an. Er der nogle der kan hjælpe mig igang?
Spørgsmål: Consider the custom C# reference type - described below - in which the equals operator is overridden: Which of these requirements should be true for GetHashCode when implementing it in the custom class?
[code]public class something { private int a; public something(int, newA)... public override bool Equals(object obj).. }[/code]
Mine svarmuligheder er: 1) There are no requirements. since GetHashCode is used only by value types 2) If two different objects of the same type are considered equal using their equals operator, their hash code must be identical. The opposite is NOT required 3) If two different objects of the same type are considered equal using their equals operator, their hash code must be identical. The opposite IS required
Du kan tænke på, hvad der sker, hvis du bruger objekter af den klasse som nøgler i en Hashtable - her bruges GetHashode til at gemme nøglen og finde den igen (sammen med den tilhørende værdi).
Hvis nu et objekt efter tilføjelse til Hashtable er "det samme" (altså mht equals), virker det rimeligt, at man stadig kan bruge det til at slå op i Hashtable med.
Hvis objektet er modificeret, så equals nu returnerer noget andet end ved tilføjelsen til Hashtable, er det så at sige ikke længere det samme objekt, og kan ikke længere bruges til at finde værdien i Hashtable med.
At forskellige objekter ikke behøver være "unequal" når deres hash codes er forskellige, betyder at man kan mappe forskellige objekter til samme hash code, og det giver mening, da en hashcode er en kondenseret udgave af dit objekt. Ellers ville det også være svært at lave en Int32 værdi fra et vilkårligt objekt. Nu er jeg ikke matematiker, men man forsøger gerne at lave så stor spredning som muligt på hash codes, så der er mindre sandsynlighed for at ramme samme værdi med to forskellige objekter - så er de hurtigere at finde i en Hashtable.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.