2013-08-02 4 views
6

मेरे पास वर्तमान में एक कक्षा है और मैं इसके कन्स्ट्रक्टर के साथ थोड़ा उलझन में हूं।`यह` और एक क्लास कन्स्ट्रक्टर

public class BarListTracker : GotTickIndicator 
{ 
    public BarListTracker(BarInterval interval) : this(new BarInterval[] { interval }) { } 
} 

this(new BarInterval[] { interval }) कथन का क्या अर्थ है?

+2

यह कन्स्ट्रक्टर ओवरलोडिंग के लिए सी # सिंटैक्स है। http://stackoverflow.com/a/5555741/1445661 – mao47

उत्तर

2

का संकेत है कि है कि वे आधारित हैं, या बुला , कक्षा में एक और कन्स्ट्रक्टर जब इसे BarInterval की सरणी के रूप में मूल्य कहा जाता है और गुजरता है। इस मामले में यह आधार वर्ग नहीं है क्योंकि अन्यथा यह : base(...) कहता है, यह एक ही श्रेणी में परिभाषित एक और निर्माता है।

यह बहुत आम है क्योंकि आप कक्षा को कई अलग-अलग तरीकों तक पहुंचना चाहते हैं, और इस मामले में, ऐसा लगता है कि वे कोड में सरणी सेट किए बिना कभी-कभी एक ही ऑब्जेक्ट भेजने में सक्षम होना चाहते थे।

हालांकि, एक बात वे कर सकते थे बस अन्य निर्माता बदल गया है, एक : this साथ बुलाया जा रहा है इस होने के लिए:

public BarListTracker(params BarInterval[] interval) 

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

var arrOfBarInterval = new BarInterval[] { val1, val2 }; 
var tracker = new BarListTracker(arrOfBarInterval); 

लेकिन, आप भी सिर्फ एक पारित कर सकते हैं:

var tracker = new BarListTracker(barInterval); 

आप ऐसा करने की क्षमता है, तो कि मैं इसकी सिफारिश करूंगा।

नोट करने के लिए एक चेतावनी, : this(...) कन्स्ट्रक्टर से पहले जिस कंस्ट्रक्टर में हैं, उसे बुलाया जाता है। तर्क बनाते समय इसे ध्यान में रखें।

+0

धन्यवाद जिसने मदद की - टाइमर – Rajeshwar

+0

@ राजेश्वर के बाद उत्तर के रूप में चिह्नित, मुझे खुशी है कि मैं सहायता का हो सकता हूं और उत्तर के रूप में निशान की सराहना करता हूं! आपका दिन अच्छा रहे! –

14

यह constructor chaining है। अनिवार्य रूप से, आप उस कन्स्ट्रक्टर की सामग्री को निष्पादित करने से पहले एक अलग कन्स्ट्रक्टर को कॉल कर रहे हैं।

public class Foo 
{ 
    public Foo() 
     : this("Hello") 
    { 
     Console.Write(" World!"); 
    } 

    public Foo(string text) 
    { 
     Console.Write(text); 
    } 
} 

new Foo(); //outputs "Hello World!" 
तो कहीं

अपने BarListTracker एक और निर्माता है कि या तो एक BarInterval[] सरणी या एक IEnumerable<BarInterval> इस तरह लेता है वहाँ होना चाहिए:

public class BarListTracker : GotTickIndicator 
{ 
    public BarListTracker(BarInterval interval) 
     : this(new BarInterval[] { interval }) 
    { 
     //specific initialization for this constructor 
    } 

    public BarListTracker(BarInterval[] intervals) 
    { 
     //shared initialization logic for both constructors 
    } 
} 

यह शरीर BarListTracker(BarInterval[]) निष्पादित करेंगे, तो के शरीर पर अमल BarListTracker(BarInterval)

यह आमतौर पर है कोड डुप्लिकेशन को कम करने के लिए प्रयोग किया जाता है। यदि आपके BarListTracker के लिए कुछ प्रारंभिक कोड था, तो इसे एक ही स्थान पर लिखना और उस तर्क को अपने रचनाकारों के साथ साझा करना और प्रत्येक के लिए इसे फिर से लिखना है।

इसके अलावा, यह आपको बुनियादी अभिव्यक्तियों के साथ इनपुट पैरामीटर को पास या संशोधित करने देता है। तो इस मामले में, BarListTracker(BarInterval[]) कन्स्ट्रक्टर को कॉल करने के साथ-साथ, यह हस्ताक्षर से मेल खाने के लिए एकल BarInterval interval ऑब्जेक्ट को सरणी के रूप में लपेट रहा है। संभावना है कि यह प्रोग्रामर के लिए एक सरल एपीआई प्रदान करने के लिए केवल एक सुविधा अधिभार है, जिसके साथ ट्रैकर बनाने के लिए अक्सर एक ही BarInterval हो सकता है।

4

इसका मतलब है BarListTracker के किसी अन्य निर्माता का कॉल जो BarInterval ऑब्जेक्ट्स की एक सरणी लेता है, जो इस कन्स्ट्रक्टर में पारित ऑब्जेक्ट वाली सरणी में गुजरता है।

var tracker = new BarListTracker(new BarInterval[] { interval }); 
+1

अरे तुम इतनी तेजी से हो :) :))! –

2

कॉल इस वर्ग में एक और निर्माता, कुछ इस तरह:: यह कॉल

var tracker = new BarListTracker(interval); 

इस के बराबर बनाता

public BarListTracker(BarInterval[] intervals) 
1

यह उदाहरण के लिए एक ही कक्षा की एक और निर्माता कॉल

public class Point{ 
    public Point(int x, int y){ 
     this.x=x; 
     this.y=y; 
    } 

    public Point():this(0,0){} 
} 

आप कॉल अपने कोड में अगर

var p= new Point(); 

आप parameterless निर्माता परिभाषित जो पैरामीटर के लिए गुजर साथ निर्माता फोन करेगा का उपयोग करेगा उसे 0,0

यह बहुत उपयोगी है यदि आपके पास एक से अधिक कन्स्ट्रक्टर हैं जो बहुत सारे पैरामीटर स्वीकार करते हैं और सरल विपक्ष प्रदान करना चाहते हैं डिफ़ॉल्ट पैरामीटर के साथ ट्रुक्टर

0

आपके पास एक और कन्स्ट्रक्टर होगा जो पैराइंटरवाल को पैरामीटर के रूप में ले जाएगा। यह मूल रूप से कुछ भी नहीं है बल्कि एक अन्य कन्स्ट्रक्टर से कन्स्ट्रक्टर को बुला रहा है। एक और लिंक जो उपयोगी हो सकता है Call one constructor from another

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