c# - पैरामीटर के साथ एक बनाते समय डिफ़ॉल्ट पैरामीटर रहित कन्स्ट्रक्टर क्यों जाता है




java c++ (7)

सी #, सी ++ और जावा में, जब आप एक कन्स्ट्रक्टर लेआउट पैरामीटर बनाते हैं, तो डिफ़ॉल्ट पैरामीटर रहित एक चला जाता है। मैंने हमेशा इस तथ्य को स्वीकार कर लिया है, लेकिन अब मैंने सोचना शुरू कर दिया है क्यों।

इस व्यवहार का कारण क्या है? क्या यह सिर्फ "सुरक्षा उपाय / अनुमान" कह रहा है, "यदि आपने स्वयं का एक कन्स्ट्रक्टर बनाया है, तो शायद आप यह निहित व्यक्ति को चारों ओर लटका नहीं चाहते हैं"? या क्या इसका कोई तकनीकी कारण है जो संकलक को स्वयं बनाने के बाद संकलक को एक बार जोड़ना असंभव बनाता है?


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


ऐसा कोई कारण नहीं है कि यदि आप अपना खुद का जोड़ चुके हैं तो संकलक कन्स्ट्रक्टर को नहीं जोड़ सका - संकलक जो कुछ भी चाहता है वह कर सकता है! हालांकि, आपको यह देखना होगा कि सबसे ज्यादा समझ में आता है:

  • यदि मैंने गैर-स्थैतिक वर्ग के लिए किसी भी निर्माता को परिभाषित नहीं किया है, तो संभवतः मैं उस वर्ग को तुरंत चालू करने में सक्षम होना चाहता हूं। इसे अनुमति देने के लिए, कंपाइलर को एक पैरामीटर रहित कन्स्ट्रक्टर जोड़ना होगा, जिसका कोई प्रभाव नहीं होगा लेकिन तत्काल अनुमति देने के लिए। इसका मतलब यह है कि मुझे इसे बनाने के लिए अपने कोड में एक खाली कन्स्ट्रक्टर शामिल करने की आवश्यकता नहीं है।
  • यदि मैंने अपने स्वयं के एक निर्माता को परिभाषित किया है, खासकर पैरामीटर के साथ, तो मुझे सबसे अधिक संभावना है कि कक्षा बनाने पर इसे निष्पादित किया जाना चाहिए। यदि संकलक इस मामले में एक खाली, पैरामीटर रहित कन्स्ट्रक्टर बनाना चाहते थे, तो यह किसी को उस तर्क को छोड़ने की अनुमति देगा जो मैंने लिखा था, जो मेरे कोड को सभी तरीकों से तोड़ने का कारण बन सकता है। अगर मैं इस मामले में एक डिफ़ॉल्ट खाली कन्स्ट्रक्टर चाहता हूं, तो मुझे इतना स्पष्ट रूप से कहना होगा।

इसलिए, प्रत्येक मामले में, आप देख सकते हैं कि मौजूदा कंपाइलरों का व्यवहार कोड की संभावित मंशा को संरक्षित करने के संदर्भ में सबसे अधिक समझ में आता है।


डिफ़ॉल्ट, पैरामीटर रहित कन्स्ट्रक्टर जोड़ा जाता है यदि आप वस्तु निर्माण पर नियंत्रण लेने के लिए स्वयं कुछ भी नहीं करते हैं। एक बार जब आप नियंत्रण लेने के लिए एक कन्स्ट्रक्टर बना लेते हैं, तो कंपाइलर "बैक ऑफ" होता है और आपके पास पूर्ण नियंत्रण होता है।

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


निश्चित रूप से कोई तकनीकी कारण नहीं है कि भाषा को इस तरह से डिजाइन किया जाना चाहिए।

चार कुछ हद तक यथार्थवादी विकल्प हैं जिन्हें मैं देख सकता हूं:

  1. बिल्कुल कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं
  2. वर्तमान परिदृश्य
  3. डिफ़ॉल्ट रूप से हमेशा एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करते हैं, लेकिन इसे स्पष्ट रूप से दबाया जा सकता है
  4. हमेशा इसे दबाए जाने के बिना एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करते हैं

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

विकल्प 2 मैं ठीक हूँ।

शेष भाषा के लिए विकल्प 3 जावा और सी # दोनों के प्रवाह के खिलाफ चला जाता है। ऐसा कुछ भी नहीं है जिसे आप स्पष्ट रूप से "हटा दें", जब तक आप स्पष्ट रूप से जावा में डिफ़ॉल्ट रूप से चीजों को अधिक निजी बनाने की गणना नहीं करते हैं।

विकल्प 4 भयानक है - आप बिल्कुल कुछ मानकों के साथ निर्माण को मजबूर करने में सक्षम होना चाहते हैं। new FileStream() मतलब क्या होगा?

तो मूल रूप से, यदि आप इस आधार को स्वीकार करते हैं कि एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान करना बिल्कुल समझ में आता है, तो मेरा मानना ​​है कि जैसे ही आप अपना स्वयं का कन्स्ट्रक्टर प्रदान करते हैं, इसे दबाकर इसे बहुत अधिक समझ में आता है।


मुझे लगता है कि यह संकलक द्वारा संभाला जाता है। यदि आप ILDASM में ILDASM असेंबली खोलते हैं तो आप डिफ़ॉल्ट कन्स्ट्रक्टर देखेंगे, भले ही यह कोड में न हो। यदि आप एक पैरामीटरयुक्त कन्स्ट्रक्टर को परिभाषित करते हैं तो डिफ़ॉल्ट कन्स्ट्रक्टर मधुमक्खी नहीं देखा जाएगा।

दरअसल जब आप कक्षा (गैर स्थैतिक) को परिभाषित करते हैं, तो संकलक इस सुविधा को यह सोचता है कि आप केवल एक उदाहरण बनायेंगे। और यदि आप प्रदर्शन करने के लिए कोई विशिष्ट ऑपरेशन चाहते हैं तो निश्चित रूप से आपका स्वयं का कन्स्ट्रक्टर होगा।


यह कंपाइलर का एक सुविधाजनक कार्य है। यदि आप पैरामीटर के साथ एक कन्स्ट्रक्टर परिभाषित करते हैं लेकिन पैरामीटर रहित कन्स्ट्रक्टर को परिभाषित नहीं करते हैं, तो संभावना है कि आप पैरामीटर रहित कन्स्ट्रक्टर को अनुमति नहीं देना चाहते हैं।

यह कई वस्तुओं के लिए मामला है जो एक खाली कन्स्ट्रक्टर के साथ शुरू करने के लिए समझ में नहीं आता है।

अन्यथा आपको प्रत्येक वर्ग के लिए एक निजी पैरामीटर रहित कन्स्ट्रक्टर घोषित करना होगा जिसे आप प्रतिबंधित करना चाहते हैं।

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


परिसर

इस व्यवहार को कक्षाओं के डिफ़ॉल्ट सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर के निर्णय के प्राकृतिक विस्तार के रूप में देखा जा सकता है। पूछे जाने वाले प्रश्न के आधार पर हम इस निर्णय को आधार के रूप में लेते हैं और मानते हैं कि हम इस उदाहरण में इस पर सवाल नहीं उठा रहे हैं।

डिफ़ॉल्ट कन्स्ट्रक्टर को हटाने के तरीके

यह इस प्रकार है कि डिफ़ॉल्ट सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर को हटाने का एक तरीका होना चाहिए। यह निष्कासन निम्नलिखित तरीकों से पूरा किया जा सकता है:

  1. एक गैर-सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर घोषित करें
  2. पैरामीटर के साथ एक कन्स्ट्रक्टर घोषित होने पर स्वचालित रूप से पैरामीटर रहित कन्स्ट्रक्टर को हटा दें
  3. पैरामीटर रहित कन्स्ट्रक्टर को हटाने के लिए कंपाइलर को इंगित करने के लिए कुछ कीवर्ड / विशेषता (अजीब पर्याप्त है कि इसे रद्द करना आसान है)

सर्वश्रेष्ठ समाधान का चयन करना

अब हम खुद से पूछते हैं: यदि कोई पैरामीटर रहित कन्स्ट्रक्टर नहीं है, तो इसे किसके द्वारा बदला जाना चाहिए? और किस प्रकार के परिदृश्य हम डिफ़ॉल्ट सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर को हटाना चाहते हैं?

चीजें जगह में गिरने लगते हैं। सबसे पहले, इसे या तो पैरामीटर के साथ या गैर-सार्वजनिक कन्स्ट्रक्टर के साथ एक कन्स्ट्रक्टर के साथ प्रतिस्थापित किया जाना चाहिए। दूसरा, जिन परिस्थितियों में आप पैरामीटर रहित कन्स्ट्रक्टर नहीं चाहते हैं वे हैं:

  1. हम नहीं चाहते कि वर्ग को तुरंत चालू किया जाए, या हम निर्माता की दृश्यता को नियंत्रित करना चाहते हैं: एक गैर-सार्वजनिक कन्स्ट्रक्टर घोषित करें
  2. हम निर्माण पर प्रदान किए जाने वाले पैरामीटर को मजबूर करना चाहते हैं: पैरामीटर के साथ एक कन्स्ट्रक्टर घोषित करें

निष्कर्ष

वहां हमारे पास है - वास्तव में दो तरीकों से सी #, सी ++ और जावा डिफ़ॉल्ट सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर को हटाने की अनुमति देते हैं।





default-constructor