2011-01-25 22 views
9

मैं वास्तव में पुन: प्रयोज्य कोड के लिए सर्वोत्तम प्रथाओं है कि आसानी से डिबग है यह पता लगाने की कोशिश कर रहा हूँ में अशक्त के लिए जांच की जा रही। मैं डेवलपर्स के बीच एक आम प्रथा में भाग गया हूं कि मैं अभी तक समझ में नहीं आता हूं।निर्माता

public MyConstructor(Object myObject) 
{ 
    if (myObject == null) 
     throw new ArgumentNullException("myObject is null."); 
    _myObject = myObject; 
} 

यह लगभग इस चेक करने के लिए अनावश्यक लगता है। लेकिन मुझे लगता है क्योंकि मैं पूरी तरह से समझ में नहीं आता क्या इस चेक कर के क्या लाभ हैं बस। ऐसा लगता है कि एक शून्य संदर्भ अपवाद किसी भी तरह फेंक दिया जाएगा? मैं शायद गलत हूं, वास्तव में इस पर कुछ विचार सुनना चाहूंगा।

धन्यवाद।

+0

आप जो कर रहे हैं वह आवश्यक नहीं है, आप ऑब्जेक्ट का संदर्भ देने से पहले यह सुनिश्चित करने के लिए जांच सकते हैं कि यह शून्य नहीं था। निश्चित रूप से यह सत्यापित करना कि जब आप अपनी ऑब्जेक्ट को इंटिलाइज्ड करते हैं तो आप एक बहुत ही वैध दृष्टिकोण है। –

+2

@ रामहाउंड - यह संरचना का उपयोग करते समय डी फ्रेमवर्क का उपयोग करते समय यह एक आम तरीका है जहां आपको कन्स्ट्रक्टर में जो भी पारित किया गया है उस पर प्रत्यक्ष नियंत्रण नहीं है। यदि आपकी कक्षा 'myObject' के बिना बेकार है और इसे शुरू करने के लिए यह एकमात्र जगह है तो अपवादों को जितनी जल्दी हो सके फेंकना समझ में आता है ताकि आप उनके बारे में जान सकें। एक लंबे समय तक चलने वाले वेब ऐप में आपको इस मुद्दे के बारे में पता नहीं हो सकता है जब तक कोई व्यक्ति उस विधि को कॉल करने के लिए न हो जिसके लिए ऑब्जेक्ट की आवश्यकता होती है। –

उत्तर

17

कंपाइलर के लिए, null एक वैध निर्माता तर्क है।

आपकी कक्षा myObject के लिए एक शून्य मान को संभालने में सक्षम हो सकती है। लेकिन अगर यह नहीं कर सकते हैं - अगर आपकी कक्षा को जब myObject रिक्त है - तो निर्माता में जाँच fail fast करने की अनुमति देता।

+0

बहुत अच्छी तरह से समझाया। मुझे विशेष रूप से "असफल असफल" शब्द पसंद आया। अंतर्दृष्टि के लिए धन्यवाद। – jsmith

+2

+1 वाह, यह एक उत्कृष्ट पेपर है। लिंक के लिए धन्यवाद। –

1

कंपिलियर को किसी ऑब्जेक्ट के मूल्य के बारे में कोई जानकारी नहीं है, इसलिए आपको यह सुनिश्चित करने के लिए रनटाइम पर जांचना होगा कि इसे शून्य मान के साथ नहीं कहा जाता है।

यह आपके विशेष समाधान पर भी निर्भर करता है। आप मैं केवल फेंक अगर आपको लगता है कि मान शून्य हो नहीं हो सकता हैं, अपवाद फेंक की जरूरत नहीं है, और अगर यह रिक्त है, कि एक असाधारण मामला है।

1

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

खुद से पूछें कि क्या यह शून्य मूल्यों को अनुमति देने के लिए समझ में आता है या नहीं और उसके अनुसार निर्माता को डिज़ाइन करता है।

3

null ऑब्जेक्ट पास करना कई मामलों में पूरी तरह से कानूनी है - इस वर्ग के लिए कार्यान्वयनकर्ता यह सुनिश्चित करना चाहता है कि आप वैध Object उदाहरण पास करने के लिए कक्षा w/o का उदाहरण नहीं बना सकते हैं, इसलिए बाद में कोई जांच नहीं होनी चाहिए पर - यह इस को जल्द से जल्द सुनिश्चित करने के लिए एक अच्छा अभ्यास है, जो निर्माता में होगा है।

0

आपको स्पष्ट रूप से शून्य की जांच करने की आवश्यकता है क्योंकि संकलक नहीं जानता है, बल्कि यह भी कि एक शून्य तर्क वैध तर्क हो सकता है।

0

लाभ यह है कि ऑब्जेक्ट निर्माण के समय अपवाद फेंक दिया जाएगा, ताकि आप आसानी से पता लगा सकें कि कोड का कौन सा हिस्सा अपराधी है। अपने कोड में गैर-शून्य myobject मूल्य की आवश्यकता है और आप निर्माता में यह मान्य नहीं है, NullReferenceException फेंक दिया जाएगा जब आप myObject_ का उपयोग करें और तुम वापस मैन्युअल रूप से पता लगाने के लिए जो में है कि शून्य मान भेजा देखने के लिए होगा।

1

आप प्रत्येक बार लिखने वाले कोड को कम करने के लिए एक सरल ThrowIfNull एक्सटेंशन विधि लागू कर सकते हैं। जॉन स्कीट ने इसे blog और संदर्भित SO लेख here में शामिल किया।

+0

ब्लॉग लिंक टूटा हुआ है, लेकिन मुझे लगता है कि यह वही लेख है: http://codeblog.jonskeet.uk/2009/12/09/quot-magic-quot-null-argument-testing/comment-page-1/ निंजा वेपोन के उपयोग के लिए –

2

अगर आप 4.0 के तहत आप निम्न कर सकते हैं:

public ctor(IEnjection ninjaWeapon) 
{ 
    Contract.Requires<ArgumentNullException>(ninjaWeapon != null); 
    this.deadlyWeaponary.Add(ninjaWeapon); 
} 

एक पुराने संस्करण के तहत अगर आप, Microsoft.Contract संदर्भ एक ही बात करते हैं।

+1

+1 – ninjasense