VS2005 प्रलेखन भाग में Guidelines for Overloading Equals() and Operator == (C# Programming Guide) राज्यों गैर अपरिवर्तनीय प्रकार मेंजब .NET क्लास ओवरराइड बराबर होना चाहिए()? यह कब नहीं होना चाहिए?
अधिभावी ऑपरेटर == अनुशंसित नहीं है।
नए .NET फ्रेमवर्क 4 प्रलेखन Guidelines for Implementing Equals and the Equality Operator (==), कि बयान को छोड़ देता है, हालांकि समुदाय सामग्री में एक पोस्ट दावे और संदर्भ पुराने प्रलेखन को दोहराता है।
ऐसा लगता है कि यह इस तरह
public class ImaginaryNumber
{
public double RealPart { get; set; }
public double ImaginaryPart { get; set; }
}
गणित में, दो काल्पनिक संख्याओं है कि एक ही असली हिस्सा और एक ही काल्पनिक हिस्सा हैं के रूप में कुछ तुच्छ परिवर्तनशील कक्षाओं के लिए बराबर() कम से कम ओवरराइड करने के लिए उचित है, वास्तव में उस समय के बराबर बराबर है जब समानता का परीक्षण किया जाता है। यह कहना गलत है कि वे के बराबर नहीं हैं, जो तब होगा जब एक ही रीयलपार्ट और इमेजिनरीपार्ट के साथ अलग-अलग ऑब्जेक्ट बराबर नहीं थे() ओवरराइड नहीं थे।
दूसरी तरफ, अगर कोई बराबर ओवरराइड करता है() को GetHashCode() को ओवरराइड करना चाहिए। यदि एक इमेजिनरी नम्बर जो बराबर है() और GetHashCode() को हैशसेट में रखा गया है, और एक परिवर्तनीय उदाहरण इसके मान को बदलता है, तो वह ऑब्जेक्ट हैशसेट में नहीं मिलेगा।
क्या एमएसडीएन गैर-अपरिवर्तनीय प्रकारों के लिए Equals()
और operator==
ओवरराइड करने के बारे में दिशानिर्देश को हटाने के लिए गलत था?
क्या उत्परिवर्तनीय प्रकारों के लिए बराबर() को ओवरराइड करना उचित है, जहां "वास्तविक दुनिया में" सभी गुणों के समानता का अर्थ है कि ऑब्जेक्ट्स स्वयं बराबर हैं (ImaginaryNumber
के साथ)?
यदि यह उचित है, तो संभावित ऑब्जेक्टिवता के साथ सबसे अच्छा कैसे निपटता है जबकि ऑब्जेक्ट इंस्टेंस हैशसेट में भाग ले रहा है या कुछ और जो GetHashCode() पर निर्भर नहीं है?
अद्यतन
बस आमतौर पर, आप मूल्य समानता को लागू जब प्रकार की वस्तुओं हैं जब उनके किसी प्रकार का संग्रह है, या में जोड़े जाने की उम्मीद इस in MSDN
में आए प्राथमिक उद्देश्य फ़ील्ड या गुणों का एक सेट स्टोर करना है। आप सभी फ़ील्ड और प्रकार के गुणों की तुलना में मूल्य समानता की अपनी परिभाषा का आधार बना सकते हैं, या आप सबसेट पर परिभाषा का आधार बना सकते हैं। लेकिन दोनों ही मामलों में, और दोनों वर्गों और structs में, अपने कार्यान्वयन तुल्यता के पांच की गारंटी देता है पालन करना चाहिए:
है मैं इसे उचित है 'ImaginaryNumber' एक परिवर्तनशील प्रकार होने के लिए नहीं लगता। –
हकीकत में, आपको शायद इमेजिनरी नम्बर को एक अपरिवर्तनीय मान प्रकार (संरचना) के रूप में लागू करना चाहिए। – Joe
वास्तव में? क्यूं कर? अन्य सभी संख्या उत्परिवर्तनीय हैं। –