2010-10-14 13 views
31

विस्तार विधियों को केवल गैर-नेस्टेड, गैर-जेनेरिक स्थैतिक वर्ग में क्यों अनुमति दी जाती है? क्या नेस्टेड, सामान्य स्थैतिक वर्ग में विस्तार विधियों पर विचार करना बेकार है?विस्तार विधियों को केवल गैर-नेस्टेड, गैर-सामान्य स्थैतिक वर्ग में क्यों अनुमति दी जाती है?

उत्तर

49

एक्सटेंशन विधियों को केवल गैर-नेस्टेड, गैर-सामान्य स्थैतिक वर्ग में क्यों अनुमति दी जाती है?

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

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

असल में, एक्सटेंशन विधियों को LINQ कार्य करने के लिए डिज़ाइन किया गया था। कुछ भी जो LINQ काम करने में योगदान नहीं करता था कटौती की गई थी। LINQ को केवल स्थिर, गैर-जेनेरिक, गैर-नेस्टेड कक्षाओं में काम करने के लिए एक्सटेंशन विधियों की आवश्यकता होती है, इसलिए हमने इसे डिज़ाइन और कार्यान्वित किया है।

यदि आपके पास ऐसा परिदृश्य है जहां गैर-स्थैतिक, जेनेरिक, या नेस्टेड कक्षाओं में एक्सटेंशन विधियां उपयोगी होंगी तो मुझे परिदृश्य पर एक नज़र डालने में खुशी होगी। जितना वास्तविक वास्तविक परिदृश्य हमें मिलता है, उतना ही अधिक संभावना है कि हम कुछ अनुमानित भविष्य की भाषा में एक विशेषता बनाएंगे जो उन परिदृश्यों को लाभान्वित करे।

यह नेस्टेड, सामान्य स्थिर कक्षा में विस्तार तरीकों पर विचार करना बेकार है?

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

+1

ठीक है। धन्यवाद। अच्छा और स्पष्ट स्पष्टीकरण! LINQ के लिए ... – xport

+0

@EricLippert: मुझे इस आलेख को पहले गैर-स्थैतिक वर्ग में एक विस्तार विधि बनाने और फिर एक स्थिर आंतरिक कक्षा में बनाने का प्रयास करने के बाद मिला। मैंने ऐसा इसलिए किया क्योंकि मैं एक नल-सुरक्षित "इंस्टेंस" विधि बनाना चाहता था जो एक डिफ़ॉल्ट मान लौटाता था (इस मामले में शून्य, इसलिए मुझे लगता है कि इसे शून्य-प्रचार करने वाले सदस्य-पहुंच का मामला माना जा सकता है, हालांकि मैं वास्तव में सोच रहा था यह एक और सामान्य दृश्य से)। यह बहुत अच्छा होगा अगर अधिकांश, यदि नहीं, तो स्ट्रिंग विधियों की तरह इस तरह थे; यह शायद इसके लिए बहुत देर हो चुकी है, लेकिन अगर यह शुरुआत में उपलब्ध थी ... – jmoreno

+1

संभवतः मेरा प्रश्न जो अनिवार्य रूप से इस पर एक डुप्लिकेट है, एक असली दुनिया का उदाहरण प्रदान करता है (?) ... http://stackoverflow.com/प्रश्न/11443842/क्यों-नहीं-अनुमति-विस्तार-विधि-परिभाषा-इन-नेस्टेड-श्रेणी –

3

मुझे विश्वास है कि यह किया गया था ताकि संकलक उचित समय में एक्सटेंशन विधि का पता लगा सके/खोज सके। इसके अलावा, ध्यान दें कि फ़ाइल स्कोप में मौजूद नामस्थानों के सेट में केवल जटिल खोज एक्सटेंशन विधियां - यह इसी कारणों से भी की जाती है।

यदि आप जेनेरिक स्थैतिक वर्ग परिदृश्य के बारे में सोचते हैं, तो कंपाइलर को एक्सटेंशन विधि से मेल खाने के लिए सभी संभावित प्रकार संयोजनों के लिए ठोस प्रकारों को तुरंत चालू करने का प्रयास करना चाहिए। भले ही शिकायतकर्ता ऐसा करने में स्मार्ट हो, फिर भी विस्तार विधियों को कॉल करने के लिए कंक्रीट प्रकार को तत्काल करने से साइड इफेक्ट हो सकता है कि डेवलपर को पता नहीं हो सकता है।

+0

हालांकि, आप अभी भी वर्ग के स्कोप व्हीवर में हो सकते हैं, हालांकि कक्षा है। मैं, एक नेस्टेड स्थैतिक वर्ग के विस्तार रैपिंग कक्षा में गुंजाइश में होगा; और विशेष रूप से यह समस्याग्रस्त नहीं है भले ही रैपिंग क्लास गैर स्थैतिक और सामान्य हो। –

+0

मैंने इस तर्क को (गैर-नेस्टेड, गैर-जेनेरिक स्थैतिक कक्षाओं को अपनी खोज तेज करने के लिए विस्तार विधियों का प्रतिबंध) सुना है, लेकिन अब मुझे इतना आश्वस्त नहीं है: मुझे संदेह है कि सभी स्थिर तरीकों को बहुत तेज़ी से पहचानना संभव होगा 'एक्सटेंशन एट्रिब्यूट' के साथ सजाए गए एक असेंबली में, अर्थात् 'कस्टमएट्रिब्यूट' सीएलआई मेटाडेटा तालिका स्कैन करके ([सीएलआई विनिर्देश (ईसीएमए -335) के अध्याय II.22.10 देखें (http: //www.ecma-international। org/प्रकाशन/फ़ाइलें/ECMA-अनुसूचित जनजाति/ECMA-335.pdf))। – stakx

5

जैसा कि एरिक लिपर्ट ने अपने ब्लॉग में कई बार लिखा है, सी # में प्रत्येक परिवर्तन का ध्यानपूर्वक इसे उचित ठहराने के लिए मानदंडों के एक सेट के खिलाफ मूल्यांकन किया जाता है और अकेले प्रौद्योगिकी के आधार पर नहीं। इस मामले में जोखिम को कम करने के लिए LINQ को काटने के लिए आवश्यक नहीं था। एक समान प्रश्न के लिए एरिक से blog post देखें।

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

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