2013-02-13 103 views
8

मैं के बीच का अंतर समझ में नहीं एक साधारण नंगेमुझे कक्षा नाम का कब और क्यों उपयोग करना चाहिए: यह (शून्य)?

Public ClassName() {} 

और

Public ClassName() : this(null) {} 

मैं जानता हूँ कि मैं इसे उपयोग कर सकते हैं केवल अगर मैं एक +1 अतिभारित ctor है, लेकिन मैं नहीं समझ सकता इस तरह defining the parameterless constructor के फायदे।

+1

देखें: [सी # निर्माता श्रृंखलन] (http://stackoverflow.com/q/1814953/) –

+0

यह एपीआई थोड़ा साफ और निहित एकल पैरामीटर निर्माता पुन: उपयोग से कोड दोहराव कम कर देता है। – JosephHirn

उत्तर

10

यह सब तर्क है करने के लिए एकल परम निर्माता परमिट, तो यह दोहराया नहीं है।

public ClassName() : this(null) {} 

public ClassName(string s) 
{ 
    // logic (code) 
    if (s != null) { 
     // more logic 
    } 
    // Even more logic 
} 

मुझे आशा है कि यह स्पष्ट है कि "तर्क" और "और भी अधिक तर्क" this(null) के लिए नहीं तो parameterless निर्माता में दोहराया जा करने के लिए आवश्यक होता है।

+0

उत्तर देने के लिए धन्यवाद। वास्तव में "सभी तर्क" के साथ आपका क्या मतलब है? – Sergio

+1

@ डेडलस कहें कि आपको कन्स्ट्रक्टर में कुछ सेटअप कार्य करने की आवश्यकता है जो पैरामीटर पर निर्भर नहीं है। दो बार कोड कॉपी और पेस्ट करने के बजाय आप केवल पैरामीटर रहित कन्स्ट्रक्टर को दूसरे कन्स्ट्रक्टर को कॉल कर सकते हैं और वहां एक बार सेटअप कार्य कर सकते हैं। –

+1

@ डेडलस एक पैरामीटर के अस्तित्व के लिए मामूली परिवर्तन के साथ दोनों रचनाकारों में कोड दोहराने के बजाय, आप सभी कोड एक कन्स्ट्रक्टर में डालते हैं और दूसरा एक कोड और कुछ डिफ़ॉल्ट मानों के साथ एक को कॉल करता है। – Servy

3

एक बहुत ही उपयोगी मामले WinForms की तरह स्थितियों में, जहां डिजाइनर एक prameterless निर्माता की आवश्यकता है, लेकिन आप अपने प्रपत्र एक निर्माता की आवश्यकता करना चाहते हैं।

public partial SomeForm : Form 
{ 
    private SomeForm() : this(null) 
    { 
    } 

    public SomeForm(SomeClass initData) 
    { 
     InitializeComponent(); 

     //Do some work here that does not rely on initData.   

     if(initData != null) 
     { 
      //do somtehing with initData, this section would be skipped over by the winforms designer. 
     } 
    } 
} 
+0

को अपडेट किया है ठीक है, लेकिन अगर मैं इसे (शून्य) कुछ भी नहीं बदलता, मेरी आंखों पर ... मुझे क्या याद आ रही है? – Sergio

+0

@ डेडलस कुछ भी नहीं, यह एक अच्छा उदाहरण नहीं है। – Servy

+2

नहीं, अगर आप 'छोड़ देते हैं इस (शून्य)' डिजाइनर फोन करेगा कभी नहीं 'InitializeComponent()' –

1

एक पैटर्न निर्माता इंजेक्शन कहा जाता है। यह पैटर्न मुख्य रूप से यूनिट परीक्षण और तर्क साझा करने के लिए उपयोगी है। यहां एक उदाहरण है

public class SomeClass 
{ 
    private ISomeInterface _someInterface; 
    public SomeClass() : this (null){} //here mostly we pass concrete implementation 
    //of the interface like this(new SomeImplementation()) 

    public SomeClass(ISomeInterface someInterface) 
    { 
     _someInterface = someInterface;  
     //Do other logics here 
    } 
} 

जैसा कि आप यहां देखते हैं, नकली कार्यान्वयन पास करके यूनिट परीक्षण आसान हो जाएगा। इसके अलावा, तर्क साझा किया जाता है (डीआरवाई)। और निर्माता ताकि आधारित एक संदर्भ है जो मानकों

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

+0

कन्स्ट्रक्टर इंजेक्शन का उपयोग निर्भरता इंजेक्शन के साथ किया जाता है। प्रश्न और आपका उत्तर कन्स्ट्रक्टर चेनिंग दोनों के बारे में है। –