2012-08-29 12 views
5

mam podsumować moje pytanie w następujący kod snippetJaka jest różnica między GetHashCode zaimplementowanym w klasie Object i ValueType?

struct Point 
{ 
    public int X; 
    public int Y; 

    public Point(int x, int y) 
    { 
     this.X = x; 
     this.Y = y; 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 

    public void PrintValue() 
    { 
     Console.WriteLine(
      "{0},{1}", 
      this.X, this.Y); 
    } 
} 

powyżej struktury pochodzi z ValueType która zawiera metodę GetHashCode. Poniżej znajduje się wersja klasy wywodząca się z Object i zawierająca metodę GetHashCode.

class Point 
{ 
    public int X; 
    public int Y; 

    public Point(int x, int y) 
    { 
     this.X = x; 
     this.Y = y; 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 

    public void PrintValue() 
    { 
     Console.WriteLine(
      "{0},{1}", 
      this.X, this.Y); 
    } 
} 

Chciałem tylko wiedzieć. Czy jest jakaś różnica między tymi implementacjami?

Odpowiedz

6

Tak; value-types (struct s) domyślnie tworzą swój kod skrótu jako złożony z wartości swoich pól. Możesz to zaobserwować, próbując:

var s = new Point(1,2); // struct 
Console.WriteLine(s.GetHashCode()); 
s.X = 22; // <=============== struct fields should usually be readonly! 
Console.WriteLine(s.GetHashCode()); // different 

Pamiętaj, że Equals przestrzega podobnych zasad.

kontrastu, typu odniesienia (class) używa domyślnie odwołanie sama zarówno GetHashCode() i Equals(). s.X = 22 będzie nie wpływ class:

var s = new Point(1,2); // class 
Console.WriteLine(s.GetHashCode()); 
s.X = 22; 
Console.WriteLine(s.GetHashCode()); // same 
+0

Marc Gravell: +1 i dzięki za szczegółowe wyjaśnienie :) –

Powiązane problemy