2012-08-29 15 views
5

ho riassunto la mia domanda nel seguente frammento di codiceQual è la differenza tra GetHashCode implementato nella classe Object e 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); 
    } 
} 

sopra struct è derivato da ValueType che contiene il metodo GetHashCode. Di seguito è una versione di classe che deriva da Object e contiene il metodo 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); 
    } 
} 

Volevo solo sapere. C'è qualche differenza tra queste implementazioni?

risposta

6

Sì; tipi di valore (struct s) per impostazione predefinita rendono il loro codice hash come un composto dei valori dei rispettivi campi. È possibile osservare ciò provando:

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 

Si noti che Equals obbedisce a regole simili.

Per contro, un riferimento di tipo (class) utilizza, per default, il riferimento stessa sia GetHashCode() e Equals(). Il s.X = 22 sarà non impatto un class:

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

Marc Gravell: +1 e grazie per la spiegazione dettagliata :) –

Problemi correlati