2012-11-30 5 views
19

मुझे समझ नहीं आता क्यों Resharper मुझे सुझाव है कि इस कोड में "के बजाय संदर्भ समानता के लिए जाँच करने के लिए":Resharper सुझाव: संदर्भ समानता के लिए जाँच के बजाय

if (typeToTranslate.Equals(typeof(string))) 
{ 
    //do something 
} 

क्यों बेहतर होना चाहिए:

typeToTranslate == typeof(string) 

------------ संपादित ------------

इस विधि ठूंठ है:

protected IType TranslateType(Type typeToTranslate) 
{ 
    if (typeToTranslate == null) throw new ArgumentNullException("typeToTranslate"); 

    //do some stuff 

    if (typeToTranslate.Equals(typeof(string))) 
    { 
     //do some stuff 
    } 
    //return some stuff 
} 
+0

मेरा रिशेर्पर इसका सुझाव नहीं देता है? – Schoof

+0

@ थॉमस मैं संस्करण 7.0.1 – giammin

+1

का उपयोग करता हूं 'टाइप टाइप ट्रान्सलेट' वास्तव में एक 'टाइप' ऑब्जेक्ट' है, और कुछ अन्य प्रकार नहीं है? – Servy

उत्तर

20

Object.Equals संदर्भ समानता की तुलना में समान सामान्य समानता है: x == y तब x.Equals(y), लेकिन बातचीत आवश्यक नहीं है। लेकिन, जैसा कि MSDN Library में प्रलेखित:

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

ReSharper "आम आचरण और कोड सुधार" के तहत "के बजाय संदर्भ समानता के लिए जाँच करें" निरीक्षण विकल्प categorizes क्योंकि, मेरा अनुमान है ReSharper दे रहा है कि आप जानते हैं कि यह पर्याप्त प्रकार की तुलना करने के संदर्भ समानता का उपयोग करने के लिए है; आपको Equals विधि द्वारा उल्लिखित समान सामान्य समानता की आवश्यकता नहीं है (भले ही दोनों प्रकार के बराबर हैं)।

14

से System.Type documentation:

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

"string".GetType() कि और इसका मतलब यह है typeof(string)एक ही संदर्भ लौट आते हैं। सिस्टम का केवल एक ही उदाहरण है। सिस्टम के लिए टाइप ऑब्जेक्ट। AppDomain के भीतर स्ट्रिंग।

रीसर्पर का कहना है कि के बजाय == का उपयोग करने के लिए यह "बेहतर" है? मेरा अनुमान है क्योंकि == अधिक कुशल है और NullReferenceException फेंकने का जोखिम नहीं है यदि typeToTranslate शून्य (आपके मामले में) थे।

+0

मैं जाँच करें कि typeToTranslate अशक्त तो यह केवल दक्षता – giammin

+0

@giammin के लिए हो सकता है नहीं है: वह पर्याप्त आर # सुझाव देने के लिए है! – psycho

+0

सुझाव भी देता है, तो आप लिखते हैं 'बराबर (typeToTranslate, typeof (स्ट्रिंग))', तो यह संभावना नहीं है कि 'NullReferenceException' कारण है। –

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