2009-06-05 20 views
7

मैं सोच रहा हूँ क्यों सी #(वस्तु) 0 == (वस्तु) 0

0 == 0     // return true 
(object) 0 == (object) 0 // return false 
मेरे लिए

में ऐसा लगता है कि यह संदर्भ के लिए तुलना करती कलाकारों के मूल्य की तुलना की।

यह मेरे पास आया क्योंकि प्रतिबिंब के साथ मुझे वैल्यू टाइप का डिफ़ॉल्ट मान मिल रहा है जो एक ऑब्जेक्ट लौटाता है और जब मैं इसे अपनी ऑब्जेक्ट के वर्तमान मूल्य से तुलना कर रहा हूं तो यह लौटाता है कि दोनों समान नहीं हैं लेकिन समान मान हैं।

वैल्यू टाइप ऑब्जेक्ट पर समान या ToString काम का उपयोग करना, लेकिन संदर्भ प्रकार के साथ नहीं जो शून्य हो सकता है और इसलिए बराबर या ToString की अनुमति नहीं देता है।

अगर कोई मुझे बता सकता है कि मैं किसी भी प्रकार, शून्य या मूल्य के साथ अलग-अलग ऑब्जेक्ट की तुलना कैसे कर सकता हूं क्योंकि ऑब्जेक्ट == ऑब्जेक्ट जाने का गलत तरीका प्रतीत होता है। इस मामले में मेरी वस्तुओं को उनके मूल प्रकार में पुन: प्रस्तुत करने के लिए बाध्यता क्या रेफरेंस टाइप हमेशा अलग होगा?

+1

http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.71).aspx (मुक्केबाजी संदर्भ) – meandmycode

उत्तर

25

हां, यह दोनों तरफ मुक्केबाजी है, और संदर्भों की तुलना करता है। जब भी आप बॉक्स करते हैं तो आप एक नई वस्तु बनाते हैं, इसलिए संदर्भ अलग-अलग होते हैं।

Equals विधि के साथ तुलना करने का तरीका, शून्यता का कारण लेना है।

if (object.Equals(x, y)) 
{ 
    ... 
} 
4

आप मुक्केबाजी कर रहे हैं, इसलिए 'कास्ट' वास्तव में प्रत्येक के लिए एक नई वस्तु बनाता है। यदि आप अपनी वस्तु के मुकाबले तुलना कर रहे हैं तो आपको अपना खुद का लिखना होगा। कार्यान्वयन।

0

असल में, इसके बाद के संस्करण, दो वस्तु संदर्भ पैदा कर रही है स्मृति में विभिन्न स्थानों पर उन्हें भंडारण, तो स्मृति पतों की तुलना: सबसे आसान तरीका स्थिर object.Equals(object, object) विधि का उपयोग करने के लिए है। यह हर कारण झूठी वापसी करेगा।

मुझे पता है कि दो वस्तुओं की तुलना करने का एकमात्र तरीका यह देखने के लिए है कि क्या एक या दोनों वस्तुएं शून्य हैं (यदि कोई शून्य है और दूसरा नहीं है, तो वे बराबर नहीं हैं; मैं इसे निर्धारित करने के लिए आपके कार्यान्वयन में छोड़ देता हूं या नहीं शून्य == शून्य)। यदि कोई भी शून्य नहीं है, तो आप ऑब्जेक्ट पर सुरक्षित रूप से कॉल कर सकते हैं।

0

कलाकार मुक्केबाजी को मजबूर करेगा, जो अनिवार्य रूप से नई वस्तुओं को बनाता है, और फिर संदर्भों की तुलना की जाती है।

Console.Write(((object)0).Equals((object)0)); // outputs "True" 
0

यह स्पष्ट कर सकता है चीजों को एक छोटे से: आप के बजाय (ऑब्जेक्ट संदर्भ की ओर इशारा करने कार्यान्वित तुलना का प्रयोग करके) सामग्री द्वारा वस्तुओं की तुलना करना चाहते हैं, तो आप बराबर विधि का उपयोग करना चाहिए।

ऑब्जेक्ट शून्य = (ऑब्जेक्ट) 0; वापसी (ऑब्जेक्ट। एक्वाल्स (शून्य, शून्य)); // रिटर्न

संबंधित मुद्दे