यह जावा, आईएमओ से कॉपी की गई एक डिज़ाइन गलती थी।
मेरे आदर्श दुनिया में:
ToString
ToDebugString
नाम दिया जाएगा उचित रूप से
Equals
अपेक्षाएं निर्धारित करने के और GetHashCode
चला गया हो जाएगा
IEqualityComparer<T>
के ReferenceEqualityComparer
कार्यान्वयन वहाँ होगा: इस के हिस्से के बराबर होती है फिलहाल यह आसान है, लेकिन अगर इसे
- ऑब्जेक्ट्स ओवरराइड किया गया है तो "मूल" हैश कोड प्राप्त करने का कोई तरीका नहीं है। टी उनके साथ जुड़े मॉनीटर हैं:
Monitor
में एक कन्स्ट्रक्टर होगा, और Enter
/Exit
आदि उदाहरण विधियां होंगी।
समानता (और इस प्रकार hashing) सामान्य रूप में विरासत पदानुक्रम में कारण समस्याओं - इतने लंबे समय आप हमेशा तुलना आप उपयोग करना चाहते की तरह निर्दिष्ट कर सकते हैं के रूप में (IEqualityComparer<T>
के माध्यम से) और वस्तुओं IEquatable<T>
खुद को लागू कर सकते हैं वे करना चाहते हैं, मुझे नहीं लगता कि यह Object
पर क्यों होना चाहिए। EqualityComparer<T>.Default
संदर्भ कार्यान्वयन का उपयोग कर सकते हैं यदि T
IEquatable<T>
लागू नहीं किया गया है और अन्यथा वस्तुओं को स्थगित कर दिया गया है। जीवन सुखद होगा।
आह ठीक है। जबकि मैं इसमें हूं, सरणी covariance एक और मंच गलती थी। यदि आप सी # में भाषा गलतियों को चाहते हैं, तो मैं आपको एक और मामूली रान शुरू कर सकता हूं;) (यह अभी भी मेरी पसंदीदा भाषा है, लेकिन ऐसी चीजें हैं जो मेरी इच्छा पूरी तरह से की गई थीं।)
मेरे पास blogged about this कहीं और है, btw।
स्रोत
2010-06-22 18:42:07
मुझे संदेह है कि इसे 'java.lang.object' के' हैशकोड() 'के बाद मॉडलिंग किया गया था इससे पहले .NET ने इंटरफेस का उपयोग करना शुरू कर दिया था (ध्यान दें कि' GetHashCode' वापस .NET 1.0 पर जाता है)। –