2010-08-04 32 views
17

बराबर ओवरराइड पर एमएसडीएन दस्तावेज ब्राउज़ करते समय, एक बिंदु ने मेरा ध्यान खींचा।शून्य की तुलना करते समय ऑब्जेक्ट कास्टिंग क्यों करें?

this specific page के उदाहरण पर, कुछ अशक्त चेकों बना रहे हैं, और जब तुलना कर वस्तुओं System.Object प्रकार के casted हैं:

public override bool Equals(System.Object obj) 
{ 
    // If parameter is null return false. 
    if (obj == null) 
    { 
     return false; 
    } 

    // If parameter cannot be cast to Point return false. 
    TwoDPoint p = obj as TwoDPoint; 
    if ((System.Object)p == null) 
    { 
     return false; 
    } 

    // Return true if the fields match: 
    return (x == p.x) && (y == p.y); 
} 

इस डाली उपयोग करने के लिए एक विशेष कारण है, या क्या यह सिर्फ कुछ "बेकार" कोड इस उदाहरण में भूल गया है?

उत्तर

15

== ऑपरेटर को ओवरलोड करने के लिए एक प्रकार के लिए संभव है। ऑब्जेक्ट कास्ट यह सुनिश्चित करता है कि मूल परिभाषा का उपयोग किया जाता है।

+0

इसलिए एक्सएमपल कोड को कॉपी और पेस्ट करने के लिए सुरक्षित बनाते हैं। –

7

मुझे लगता है कि सिस्टम को कास्टिंग करना है। ऑब्जेक्ट आपको किसी भी ऑपरेटर ओवरलोडिंग के आसपास ले जाएगा जो दोDPoint हो सकता है।

0

यह एक बड़े नमूने का हिस्सा हो सकता है जहां == ऑपरेटर ओवरलोड हो गया था। उस स्थिति में, obj == नल का उपयोग करके StackOverflow हो सकता है यदि दोDPoint.Equals (ऑब्जेक्ट) को == परिभाषा के हिस्से के रूप में बुलाया गया था।

15

जैसा कि अन्य ने कहा, प्रकार == ऑपरेटर को ओवरराइड कर सकता है। इसलिए, Object पर कास्टिंग if (Object.ReferenceEquals(p, null)) { ... } के बराबर है।

+4

+1 संदर्भ का उपयोग करना, – Justin

+0

+1 ऑब्जेक्ट करने के लिए कास्ट की तुलना में मेरे लिए स्पष्ट है संदर्भ इरादे का उपयोग करके इरादा अधिक स्पष्ट रूप से दिखाया गया है। –

1

यह एक ओवरलोडेड == ऑपरेटर के साथ भ्रम से बचने के लिए मौजूद है। कल्पना करें कि क्या कास्ट मौजूद नहीं था और == ऑपरेटर ओवरलोड हो गया था। अब p == null लाइन ऑपरेटर == से संभावित रूप से बाध्य होगी। ऑपरेटर == के कई कार्यान्वयन बस ओवरराइड Equals विधि को स्थगित कर देते हैं। यह आसानी से एक ढेर अतिप्रवाह स्थिति

public static bool operator==(TwoDPoint left, TwoDPoint right) { 
    return left.Equals(right); 
} 

public override bool Equals(System.Object obj) { 
    ... 
    TwoDPoint p = obj as TwoDPoint; 
    if (p == null) { // Stack overflow!!! 
     return false; 
    } 

    ... 
} 

का कारण बन सकता Object कास्टिंग लेखक एक सरल संदर्भ जाँच null के लिए हो जाएगा (जो क्या करना है है) सुनिश्चित करता है के द्वारा।

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