Nó không nhất thiết phải quan trọng; nó phụ thuộc vào kích thước của các bộ sưu tập của bạn và các yêu cầu về hiệu suất của bạn và liệu lớp của bạn sẽ được sử dụng trong thư viện nơi bạn có thể không biết các yêu cầu về hiệu suất. Tôi thường biết kích thước bộ sưu tập của mình không lớn lắm và thời gian của tôi có giá trị hơn một vài phần triệu hiệu suất đạt được bằng cách tạo mã băm hoàn hảo; vì vậy (để thoát khỏi cảnh báo khó chịu của trình biên dịch) Tôi chỉ cần sử dụng:
public override int GetHashCode()
{
return base.GetHashCode();
}
(Tất nhiên tôi cũng có thể sử dụng #pragma để tắt cảnh báo nhưng tôi thích cách này hơn.)
Khi bạn đang ở trong vị trí mà bạn làm cần hiệu suất so với tất cả các vấn đề được đề cập bởi những người khác ở đây áp dụng, tất nhiên. Quan trọng nhất - nếu không, bạn sẽ nhận được kết quả sai khi truy xuất các mục từ bộ băm hoặc từ điển: mã băm không được thay đổi theo thời gian sống của một đối tượng (chính xác hơn, trong thời gian bất cứ khi nào cần mã băm, chẳng hạn như trong khi một khóa trong từ điển): ví dụ, sau đây là sai vì Giá trị là công khai và do đó có thể được thay đổi bên ngoài thành lớp trong suốt thời gian tồn tại của cá thể, vì vậy bạn không được sử dụng nó làm cơ sở cho mã băm:
class A
{
public int Value;
public override int GetHashCode()
{
return Value.GetHashCode(); //WRONG! Value is not constant during the instance's life time
}
}
Mặt khác, nếu Giá trị không thể thay đổi, bạn có thể sử dụng:
class A
{
public readonly int Value;
public override int GetHashCode()
{
return Value.GetHashCode(); //OK Value is read-only and can't be changed during the instance's life time
}
}