2012-08-29 35 views
5

Tôi đã tóm tắt câu hỏi của tôi ở sau đoạn mãSự khác biệt giữa GetHashCode được triển khai trong lớp Object và ValueType là gì?

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

trên struct có nguồn gốc từ ValueType trong đó có phương pháp GetHashCode. Dưới đây là một phiên bản lớp xuất phát từ Object và chứa phương thức 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); 
    } 
} 

Tôi chỉ muốn biết. Có sự khác nhau nào giữa các triển khai này không?

Trả lời

6

Có; các kiểu giá trị (struct s) theo mặc định làm cho mã băm của chúng dưới dạng tổng hợp các giá trị của các trường của chúng. Bạn có thể quan sát điều này bằng cách thử:

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 

Lưu ý rằng Equals tuân thủ các quy tắc tương tự.

Ngược lại, một tài liệu tham khảo-type (class) sử dụng, theo mặc định, các tài liệu tham khảo tự cho cả GetHashCode()Equals(). Các s.X = 22 sẽ không tác động một class:

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

Marc Gravell: +1 và cảm ơn cho lời giải thích chi tiết :) –

Các vấn đề liên quan