2008-12-03 9 views
15

हर अब और फिर, मैं वाक्यविन्यास में टक्कर डालता हूं जिसे मैंने पहले देखा है, लेकिन कभी भी उपयोग नहीं किया गया। यह उस काल में से एक है।: सी # कन्स्ट्रक्टर में यह (foo) वाक्यविन्यास?

क्या कोई सी # कन्स्ट्रक्टर विधि के बाद ": यह" या "आधार" के उद्देश्य को समझा सकता है?

उदाहरण के लिए:

public MyClass(SomeArg arg) : this(new SomethingElse(), arg) 
{ 
} 

मेरे पेट लग रहा है कि यह एक और निर्माता विधि पर एक डिफ़ॉल्ट तर्क मैप करने के लिए प्रयोग किया जाता है।

उत्तर

17

आप मूल रूप से सही हैं। this() वर्तमान उदाहरण पर एक निर्माता को कॉल करता है, base() वर्तमान उदाहरण पर सुपरटेप के निर्माता को कॉल करता है। वे आम तौर पर कन्स्ट्रक्टर ओवरलोड को संभालने के लिए उपयोग किए जाते हैं ताकि आप चीजों को अलग तरीके से तोड़ने के बिना अतिरिक्त विकल्प जोड़ सकें।

4

आप सही हैं।

: आधार (...) बेस क्लास के निर्माता को कॉल करता है।

: यह (...) परिभाषित वर्ग का एक और निर्माता कहता है। अधिकांश समय यह केवल एक मुखौटा के रूप में काम करता है।

3

.NET कक्षा में प्रत्येक कन्स्ट्रक्टर यह सुनिश्चित करता है कि उस वर्ग में एक निर्माता जो इसे प्राप्त करता है उसे भी कहा जाता है।

तो अगर आप निम्नलिखित श्रेणियां होती हैं:

public class Base { } 
public class Something : Base { } 
public class Else : Something { } 

तो वरना में एक निर्माता, कुछ में एक निर्माता है, जो भी बेस में एक निर्माता कॉल करेंगे कॉल करेंगे।

बेस क्लास (यानी जिसे आप अवरुद्ध कर रहे हैं) में बुलाया गया कन्स्ट्रक्टर हमेशा पैरामीटर रहित कन्स्ट्रक्टर होता है।

यदि आपके पास कोई नहीं है, या इसे ओवरराइड करना चाहते हैं, तो आप बेस (कुछ पैरामीटर यहां) निर्दिष्ट करके इसे ओवरराइड कर सकते हैं। यह बेस क्लास में सही कन्स्ट्रक्टर चुन देगा।

आप एक ही स्तर पर एक ही कक्षा में दूसरे कन्स्ट्रक्टर को कॉल करने के लिए एक कन्स्ट्रक्टर से भी पूछ सकते हैं। इसका उपयोग कई रचनाकारों में कन्स्ट्रक्टर कोड डुप्लिकेट करने से बचने के लिए किया जा सकता है। आखिरकार, जिन रचनाकारों को बुलाया जा रहा है वे बेस क्लास में एक कन्स्ट्रक्टर को कॉल करेंगे।

मुझे उम्मीद है कि यह समझ में आता है।

19

आपकी आंत महसूस सही है। वाक्य रचना एक ही कक्षा में अतिभारित कंस्ट्रक्टर्स कॉल करने के लिए प्रयोग किया जाता है:

public class Test 
{ 
    public Test() : this("Called from default constructor") { } 
    public Test(String msg) 
    { 
     Console.WriteLine(msg); 
    } 
} 

निम्नलिखित कोड:

public static void Main(String[] args) 
{ 
    Test t1 = new Test(); 
    Test t2 = new Test("Called from Main function"); 
} 

आउटपुट निम्नलिखित

Called from default constructor 
Called from main function

इसी तरह, : base(someParams) आधार कंस्ट्रक्टर्स कॉल करने के लिए प्रयोग किया जाता है ।

2

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

यह आईओसी में बहुत उपयोग किया जाता है।

2

यह इस तरह है कि अगर मैं गलत नहीं हूँ:

public MyClass(SomeArg arg) : this(new SomethingElse(), arg) 

public MyClass(SomethingElse arg, SomeArg arg1) : base or this or nothing 

कॉल करेंगे और उस पर जाना होगा जब तक आप एक आधार या कुछ भी नहीं मिला है।

आप तो base(....) है कि निर्माता होने कि मानकों के साथ आधार निर्माता फोन करेगा (यदि हो तो) दिया, बदले में अपने स्वयं के निर्माताओं के लिए (एक ही खेल) को सौंपने कर सकती हैं।

यदि आपके पास कुछ भी नहीं है, तो बेस-क्लास के पैरामीटर-कम कन्स्ट्रक्टर को स्वचालित रूप से कॉल किया जाता है।

this(....) का उपयोग करने के बाद, पैरामीटर से मेल खाने वाले कन्स्ट्रक्टर का उपयोग किया जाएगा और इसके शरीर को निष्पादित किया जाएगा - इसके अतिरिक्त this(....) का उपयोग करने वाले कन्स्ट्रक्टर के शरीर के अतिरिक्त।

2

हाँ आप सही हैं। इस वाक्यविन्यास का उपयोग आपके उप-वर्ग निर्माता को डिफ़ॉल्ट रूप से उचित कस्टम बेस क्लास कन्स्ट्रक्टर को स्पष्ट रूप से कॉल करने के लिए किया जाता है। आपके प्रश्न में यह कीवर्ड समझाया गया है:

इस कीवर्ड का एक और उपयोग अनावश्यक सदस्य प्रारंभिक तर्क से बचने के लिए एक कन्स्ट्रक्टर को दूसरे कॉल करने के लिए मजबूर करना है।

में प्रो C# 2005

और .NET 2.0 मंच, 3 संस्करण एंड्रयू ट्रोलसन द्वारा

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