यदि मैं बराबर और GetHashCode ओवरराइड करता हूं, तो मैं कैसे तय करूं कि किन फ़ील्ड की तुलना करना है? और क्या होगा यदि मेरे पास दो फ़ील्ड वाले दो ऑब्जेक्ट हैं, लेकिन बराबर केवल एक फ़ील्ड की जांच करता है?बराबर ओवरराइड() लेकिन सभी क्षेत्रों की जांच नहीं - क्या होगा?
दूसरे शब्दों में, चलो कहते हैं कि मैं इस वर्ग डालते हैं:
class EqualsTestClass
{
public string MyDescription { get; set; }
public int MyId { get; set; }
public override bool Equals(object obj)
{
EqualsTestClass eq = obj as EqualsTestClass;
if(eq == null) {
return false;
} else {
return MyId.Equals(eq.MyId);
}
}
public override int GetHashCode()
{
int hashcode = 23;
return (hashcode * 17) + MyId.GetHashCode();
}
}
मैं दो वस्तुओं बराबर पर विचार अगर वे एक ही MyID है। तो यदि आईडी बराबर है लेकिन विवरण अलग है, तो उन्हें अभी भी बराबर माना जाता है।
मैं सिर्फ आश्चर्य है कि क्या इस दृष्टिकोण का नुकसान कर रहे हैं? बेशक, इस तरह एक निर्माण के रूप में की उम्मीद कैसे कार्य करेगा:
List<EqualsTestClass> test = new List<EqualsTestClass>();
EqualsTestClass eq1 = new EqualsTestClass();
eq1.MyId = 1;
eq1.MyDescription = "Des1";
EqualsTestClass eq2 = new EqualsTestClass();
eq2.MyId = 1;
eq2.MyDescription = "Des2";
test.Add(eq1);
if (!test.Contains(eq2))
{
// Will not be executed, as test.Contains is true
test.Add(eq2);
}
eq2 के रूप में मूल्य-बराबर eq1 के लिए है, यह नहीं जोड़ा जाएगा। लेकिन वह कोड है जिसे मैं नियंत्रित करता हूं, लेकिन मुझे आश्चर्य है कि ढांचे में कोड है जो अप्रत्याशित समस्याओं का कारण बन सकता है?
तो, क्या मुझे हमेशा अपने बराबर() तुलना में सभी सार्वजनिक क्षेत्रों को जोड़ना चाहिए, या कुछ खराब फ्रेमवर्क-मोजो की वजह से अजीब आश्चर्य से बचने के लिए दिशानिर्देश क्या हैं जो पूरी तरह से अप्रत्याशित थे?
सहमत हुए, ओ पी की तरह, मैं बराबर() सिर्फ जांच करने के लिए overidden है
तो अपनी दिनचर्या में आप बस कस्टम comparer का उपयोग: यह कुछ इस तरह (VB में) लगेगा एक प्राथमिक आईडी, और यह है कि, पूरी तरह से प्रोग्रामर कॉल करते हैं। –