2012-08-29 10 views
5

yapı üzerindeNesne ve ValueType sınıfında uygulanan GetHashCode arasındaki fark nedir? Kodun aşağıdaki zaman soruyu özetlemişlerdir

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

GetHashCode yöntemi içerir ValueType türetilmiştir pasajı. Aşağıda, Nesne'den türeyen ve GetHashCode yöntemini içeren bir sınıf sürümüdür.

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

Sadece bilmek istedim. Bu uygulamalar arasında bir fark var mı?

cevap

6

Evet; Değer-türleri (struct s) varsayılan olarak kendi karma kodlarını kendi alanlarının değerlerinin bir birleşimi olarak yapar. Sen deneyerek bu gözlemleyebilirsiniz: Equals benzer kurallara uyduğunda o

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 

Not. Buna

bir referans tipi (class), varsayılan olarak, GetHashCode() ve Equals() hem referans kendisi kullanır. s.X = 22 will değil darbe bir class:

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

Marc Gravell: 1 ve ayrıntılı açıklama için teşekkürler :) –

İlgili konular