Nie rozumiem czym dokładnie jest wynik zwracany przez GetHashCode(), mogły ktoś jeszcze swoimi słowami podpowiedzieć czym to jest?
Musiałem ponadpisywać metody porównania i potworzyć przeciążenia operatorów ==,!=,+,- dla swojego typu, o ile bez problemu rozumiem na czym mają polegać metody Equal() i przeciążenia operatorów, kompletnie nie rozumiem co się dzieje w GetHashCode() - tą implementacje zerżnąłem z książki.
class CzasScala
{
///.....
public override bool Equals(object obj)
{
if (obj == null)
return false;
if (this.GetType() != obj.GetType())
return false;
return Equals((CzasScala)obj);
}
private bool Equals(CzasScala obj)
{
if (ReferenceEquals(this, obj))
return true;
if (this.GetHashCode() != obj.GetHashCode())
return false;
return (this.SumaSekund == obj.sumaSekund) &&
(this.dokladnosc_CzasDec_PoPrzecinku == obj.dokladnosc_CzasDec_PoPrzecinku);
}
public override int GetHashCode()
{
int hashCode = dokladnosc_CzasDec_PoPrzecinku.GetHashCode();
if (dokladnosc_CzasDec_PoPrzecinku.GetHashCode() != SumaSekund.GetHashCode())
{
hashCode ^= SumaSekund.GetHashCode();
}
return hashCode;
}
}
alternatywa po odwróceniu wlasciwosci /dokladnosc_czasDec_PoPrzecinku - używam do zaprezentowania czas w formie wartości dziesiętnej, to pole jest prywatne i ma zawsze wartosc 4:
public override int GetHashCode()
{
int hashCode = SumaSekund.GetHashCode();
if (dokladnosc_CzasDec_PoPrzecinku.GetHashCode() != SumaSekund.GetHashCode())
{
hashCode ^= dokladnosc_CzasDec_PoPrzecinku.GetHashCode();
}
return hashCode;
}
}
Najbardziej nie rozumiem wymogu dla GetHashCode() aby
"wartości GetHashCode() w czasie życia danego obiektu powinny być takie same - także wtedy gdy dane w obiekcie się zmieniają - "C# kompletny przewodnik dla praktyków" Mark Michaelis str.378"
ale po zerżnięciu implementacji to wymaganie nie jest spełnione i widać to w wynikach z konsoli w ostatniej linii, rozumiem dlaczego bo przecież SumaSekund się zmieniła z 67 na 65 ale nie rozumiem jak to zrobić aby po zmianie SumaSekund wartość HashCode się nie zmieniła.
CzasScala czas1 = new CzasScala(67);
CzasScala czas2 = new CzasScala(2);
CzasScala czas3 = new CzasScala(65);
CzasScala czas4 = new CzasScala(65);
CzasScala czas5 = czas3;
CzasScala czas6 = new CzasScala(4);
Console.WriteLine($"Czas: {czas1.SumaSekund}, HashCode czas1: {czas1.GetHashCode()}");
Console.WriteLine($"Czas: {czas2.SumaSekund}, HashCode czas2: {czas2.GetHashCode()}");
Console.WriteLine($"Czas: {(czas1 - czas3).SumaSekund}, HashCode czas1-czas3: {(czas1 - czas3).GetHashCode()}");
Console.WriteLine($"Czas: {czas3.SumaSekund}, HashCode czas3: {czas3.GetHashCode()}");
Console.WriteLine($"Czas: {czas4.SumaSekund}, HashCode czas4: {czas4.GetHashCode()}");
Console.WriteLine($"Czas: {czas5.SumaSekund}, HashCode czas5: {czas5.GetHashCode()}");
Console.WriteLine($"Czas: {czas6.SumaSekund}, HashCode czas6: {czas6.GetHashCode()}");
Console.WriteLine($"Czas: {(czas2+czas2).SumaSekund}, HashCode (czas2+czas2): {(czas2 + czas2).GetHashCode()}");
czas1 = (czas1 - czas2);
Console.WriteLine($"Czas: {czas1.SumaSekund}, HashCode czas1 po zmianie wartosci o -czas2 czy hashcode bedzie rowny czas3?: {czas1.GetHashCode()}");
Console.ReadLine();
Zdjęcie strony 378
- IMG_20210413_090917.jpg (1 MB) - ściągnięć: 7