1 - संदर्भ चेकों दो संदर्भ प्रकार चर (कक्षाएं, नहीं structs) एक ही स्मृति पता करने के लिए भेजा जाता है, तो बराबर होती है।
2 - आभासी बराबर() विधि चेकों दो वस्तुओं समतुल्य होते हैं।o1.Equals करने के लिए कॉल
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
हालांकि दो वस्तुओं TestClass का एक ही उदाहरण नहीं हैं,:
class TestClass{
public int Property1{get;set}
public int Property2{get;set}
public override bool Equals(object obj)
{
if (obj.GetType() != typeof(TestClass))
return false;
var convertedObj = (TestClass)obj;
return (convertedObj.Property1 == this.Property1 && convertedObj.Property2 == this.Property2);
}
}
और आप उस वर्ग से 2 वस्तुओं का दृष्टांत: हमें कहते हैं कि तुम इस वर्ग करते हैं (ओ 2) सच हो जाएगा।
3 - स्थिर बराबर विधि जब वहाँ की जांच में एक शून्य मान है समस्याओं को संभालने के लिए प्रयोग किया जाता है। कुछ भी नहीं है क्योंकि O1 अंक
o1.Equals(o2);
आप एक NullReferenceException मिल wil,: इस कल्पना कीजिए, उदाहरण के लिए:
TestClass o1 = null;
var o2 = new TestClass{property1 = 1, property2 = 2}
आप इस प्रयास करें। इस मुद्दे पता करने के लिए, आप यह करते हैं:
Object.Equals (O1, O2);
इस विधि अशक्त संदर्भ को संभालने के लिए तैयार किया जाता है।
4 - IEquatable इंटरफ़ेस नेट द्वारा प्रदान की जाती है तो तुम क्या करने की जरूरत नहीं है अपने बराबर विधि के अंदर डाले। संकलक पता चल गया है कि आप प्रकार आप समानता के लिए जाँच करने के लिए कोशिश कर रहे हैं के लिए एक कक्षा में इंटरफ़ेस को लागू किया है, तो यह Object.Equals (वस्तु) ओवरराइड से अधिक है कि विधि प्राथमिकता देंगे। उदाहरण के लिए:
class TestClass : IEquatable<TestClass>
{
public int Property1 { get; set; }
public int Property2 { get; set; }
public override bool Equals(object obj)
{
if (obj.GetType() != typeof(TestClass))
return false;
var convertedObj = (TestClass)obj;
return (convertedObj.Property1 == this.Property1 && convertedObj.Property2 == this.Property2);
}
#region IEquatable<TestClass> Members
public bool Equals(TestClass other)
{
return (other.Property1 == this.Property1 && other.Property2 == this.Property2);
}
#endregion
}
अब अगर हम ऐसा करते हैं:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
o1.Equals(o2);
बुलाया विधि बराबर (TestClass), बराबर (वस्तु) से पहले है।
5 - == ऑपरेटर आमतौर पर ReferenceEquals रूप में एक ही मतलब है, यह जाँच करता है दो चर एक ही स्मृति पता को इंगित करता है, तो। गॉचा यह है कि इस ऑपरेटर को अन्य प्रकार के चेक करने के लिए ओवरराइड किया जा सकता है। तारों में, उदाहरण के लिए, यह जांचता है कि दो अलग-अलग उदाहरण बराबर हैं या नहीं।
को लागू करने पर संदेह को हल करने के लिए उत्कृष्ट। उदाहरण वास्तव में मदद करते हैं, लेकिन आपके बिंदु 4 में एक टाइपो है जहां IEquatable.Equals अभी भी 'convertObj' – PaulG
धन्यवाद पॉलजी का उपयोग करता है, यह अभी तय है! =] – mverardo