2009-02-26 14 views
7

मेरे कोड है ...पुनर्विक्रेता निम्नलिखित सिफारिश क्यों कर रहा है?

public static void AssertNotNull<T>(string name, T val) { 
    if (val == null) 
     throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
} 

Resharper की सिफारिश कर रहा है ...

public static void AssertNotNull<T>(string name, T val) { 
    if (Equals(val, default(T))) 
     throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
} 
+0

यह ऐसी चीजें हैं जो धन के मूल्य को दस गुना अधिक बनाती हैं। –

+1

दिलचस्प प्रश्न +1, कृपया एक बार आप शीर्षक में अधिक जानकारी डाल सकते हैं ताकि अगली बार यह कह सकें कि "पुनर्विक्रेता वैल == नल को बराबर (वैल, डिफ़ॉल्ट (टी)) के साथ बदलने की सिफारिश क्यों कर रहा है" धन्यवाद। –

उत्तर

13

क्योंकि यह, अगर T एक मान प्रकार या संदर्भ प्रकार है पता नहीं है, तो यह कोड काम करता है दोनोंके साथ।

+0

इसलिए यदि मैं यह सुनिश्चित करने के लिए निम्नलिखित करना चाहता हूं कि यह एक रेफरी प्रकार है, तो मैं XXX के लिए क्या रखूं? सार्वजनिक स्थैतिक शून्य AssertNotNull (स्ट्रिंग नाम, टी वैल) जहां टी: XXX – JeremyWeir

+0

एनएम माइकल मीडोज ने उत्तर दिया कि – JeremyWeir

+2

मैं वास्तव में इस मामले में रिशेर्पर से असहमत हूं यदि यही कारण है कि यह त्रुटि दे रहा है। इसके बारे में सोचें, यदि टी एक int है, और मान वास्तव में 0 है और शून्य होना चाहिए, तो यह अपवाद फेंक देगा, जबकि यदि आप शून्य की जांच करेंगे, तो यह अपवाद नहीं फेंक देगा। – BFree

12
मैं दूसरे Berado के जवाब

, लेकिन जोड़ना होगा कि आप नीचे बाधा जोड़कर इस रोका जा सकता है कि:

public static void AssertNotNull<T>(string name, T val) where T : class 
+0

धन्यवाद, यह बहुत समझ में आता है – JeremyWeir

1

उन दो तरीकों बराबर नहीं हैं। पहला व्यक्ति AssertNotNull ("foo", 0) की अनुमति देता है जबकि दूसरा फेंकता है। मुझे लगता है कि इस मामले में रिशेर्पर अति उत्साही है।

+0

आपका बिंदु स्पॉट पर है। Resharper डिफ़ॉल्ट रूप से एक चेतावनी (पीला) के रूप में झंडे। यह सिर्फ आपको चेतावनी देना चाहता है कि यह विधि सभी संभावित इनपुट के लिए अपेक्षित काम नहीं करेगी। –

+0

er, एक संशोधन: AssertNotNull ("foo", 0) अपवाद नहीं फेंक देगा, यह कार्य करेगा जैसे यह एक शून्य मान है, क्योंकि int के लिए डिफ़ॉल्ट 0 है, इसलिए इसलिए बराबर (वैल, डिफ़ॉल्ट (टी)) मूल्यांकन सच में –

+0

मेरा मतलब था कि "नई ArgumentNullException फेंक" दूसरी विधि में चलाया जाएगा। क्या आप सहमत हैं? – Greg

2

यह स्पष्ट रूप से क्या आप इस उदाहरण में चाहते नहीं है, लेकिन यह सिर्फ यकीन है कि तुम कि संदर्भ प्रकार T के लिए इस्तेमाल किया जा सकता भूल से एक बग परिचय नहीं है, जिससे मददगार बनने की कोशिश कर रहा है। @Michael Meadows की तरह, आप शायद class बाधा T पर जोड़ना चाहते हैं।

0

मुझे लगता है क्योंकि टी गैर-संदर्भ प्रकार हो सकता है।

0

यदि आप जानते हैं कि टी हमेशा एक वर्ग तो जहां खंड ऐसा है तो अपने मूल कोड ठीक हो जाएगा कहने के लिए एक जोड़ने के लिए किया जाएगा।

public static void AssertNotNull<T>(string name, T val) 
    where T : class 
    { 
     if (val == null) 
      throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
    } 
संबंधित मुद्दे