Tôi tự thấy mình tự ghi đè Equals()
và GetHashCode()
thường xuyên để thực hiện ngữ nghĩa. Điều đó dẫn đến mã lặp đi lặp lại để viết và mong manh để duy trì (thuộc tính được thêm vào và một/cả hai ghi đè không được cập nhật).Đơn giản hóa các giá trị bằng(), GetHashCode() trong C# để duy trì tốt hơn
Mã này kết thúc lên tìm kiếm một cái gì đó như thế này (bình luận về việc thực hiện đều được chào đón):
public override bool Equals(object obj)
{
if (object.ReferenceEquals(this, obj)) return true;
MyDerived other = obj as MyDerived;
if (other == null) return false;
bool baseEquals = base.Equals((MyBase)other);
return (baseEquals &&
this.MyIntProp == other.MyIntProp &&
this.MyStringProp == other.MyStringProp &&
this.MyCollectionProp.IsEquivalentTo(other.MyCollectionProp) && // See http://stackoverflow.com/a/9658866/141172
this.MyContainedClass.Equals(other.MyContainedClass));
}
public override int GetHashCode()
{
int hashOfMyCollectionProp = 0;
// http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/
// BUT... is it worth the extra math given that elem.GetHashCode() should be well-distributed?
int bitSpreader = 31;
foreach (var elem in MyCollectionProp)
{
hashOfMyCollectionProp = spreader * elem.GetHashCode();
bitSpreader *= 31;
}
return base.GetHashCode()^//^is a good combiner IF the combined values are well distributed
MyIntProp.GetHashCode()^
(MyStringProp == null ? 0 : MyStringProp.GetHashValue())^
(MyContainedClass == null ? 0 : MyContainedClass.GetHashValue())^
hashOfMyCollectionProp;
}
Câu hỏi của tôi
- Sản phẩm mẫu âm thanh thực hiện?
- Có đủ không khi các giá trị thành phần đóng góp được phân phối tốt? Tôi có cần phải nhân với 31-to-the-N khi kết hợp các yếu tố thu thập được cho băm của họ được phân phối tốt không?
- Dường như mã này có thể được tóm tắt thành mã sử dụng sự phản chiếu để xác định các thuộc tính công khai, xây dựng cây biểu thức khớp với giải pháp được mã hóa bằng tay và thực thi cây biểu thức nếu cần. Cách tiếp cận đó có vẻ hợp lý không? Có triển khai hiện tại ở đâu đó không?
Tại sao downvote (hơn một năm sau khi công bố)? Câu hỏi là rất hợp pháp. Nếu có điều gì đó sai trái, hãy nói gì. –