Özdeş özdeşlik değerlerine sahip iş nesnelerinin eşit olduğu anlamını uygulamak için kendi kimliğimi Equals()
ve GetHashCode()
sık sık buluyorum. Bu, yazma ve yazma için kırılgan yinelenen kod yol açar (özellik eklenir ve geçersiz kılmaların biri/her ikisi de güncelleştirilmez).Daha İyi Bakımı için C# 'da Eşittir(), GetHashCode()' ı Geçersiz Kılmayı Basitleştirin
kod aşağıdaki gibi görünen biter (uygulanmasına ilişkin yorumlarınızı bekliyoruz):
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;
}
Sorularım
- mi uygulama desen ses?
- Katkıda bulunan bileşen değerlerinin iyi dağıtıldığı dikkate alındığında yeterli midir? Tahıl öğelerinin iyi bir şekilde dağıtılması durumunda toplama öğelerini birleştirirken 31 N'ye çarpmak zorunda mıyım?
- Bu kod, ortak özellikleri belirlemek için yansıma kullanan, el ile kodlanmış çözümle eşleşen bir ifade ağacı oluşturan ve ifade ağacını gerektiği şekilde yürüten bir kodla soyutlanmış gibi görünüyor. Bu yaklaşım makul görünüyor mu? Bir yerde var olan bir uygulama var mı?
olmalıdır Neden (yazdıktan sonra bir yıldan fazla) downvote? Soru çok meşrudur. Eğer yanlış bir şey varsa, lütfen ne olduğunu söyle. –