2012-08-29 13 views
5

he resumido mi pregunta en el siguiente fragmento de código¿Cuál es la diferencia entre GetHashCode implementado en Object y ValueType class?

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); 
    } 
} 

anterior estructura se deriva de ValueType que contiene método GetHashCode. A continuación se muestra una versión de clase que deriva de Object y contiene el método 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); 
    } 
} 

Solo quería saber. ¿Hay alguna diferencia entre estas implementaciones?

Respuesta

6

Sí; los tipos de valor (struct s) establecen de forma predeterminada su código hash como un compuesto de los valores de sus campos. Se puede observar esto tratando:

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 

Tenga en cuenta que Equals obedece a reglas similares.

Por el contrario, un tipo de referencia (class) utiliza, por defecto, la referencia tanto para GetHashCode() y Equals(). El s.X = 22 se no impacto que 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 y gracias por la explicación detallada :) –

Cuestiones relacionadas