2011-08-23 15 views
7

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

अद्यतन: मुझे इस डिजाइन निर्णय के पीछे कारण में दिलचस्पी है।

+0

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

+0

यह एक सटीक * डुप्लिकेट कैसे है "सामान्य स्थैतिक वर्ग में विस्तार विधियों को घोषित करना असंभव क्यों है?"। –

+0

यह एक डुप्लिकेट नहीं है। तथाकथित डबल से एक और अधिक विशिष्ट सवाल के बजाय। –

उत्तर

5

यह एक जवाब से एक अवलोकन के अधिक है, लेकिन ...

जब आप एक उदाहरण विधि वस्तु आप बुला रहे हैं में पहला तर्क के रूप में ढेर पर धकेल दिया जाता है के लिए एक संदर्भ फोन अपने विधि कॉल वह पहला तर्क "यह" है और यह पूरी तरह से किया जाता है।

जब आप एक विस्तार विधि को परिभाषित करते हैं, तो आप स्पष्ट रूप से "यह" को पहले तर्क के रूप में परिभाषित करते हैं।

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

+0

यह एक महान अवलोकन और एक व्यावहारिक भी है। इसे साझा करने के लिए धन्यवाद। – Mehran

+0

शायद, आईएमएचओ को छोड़कर वास्तव में नियम के लिए एक बड़ा अपवाद होना चाहिए: एक वर्ग या संरचना को विस्तार के सदस्यों को परिभाषित करने की अनुमति दी जानी चाहिए जो अपने स्वयं के सदस्यों पर काम करते हैं, और structs के मामले में, यह संभव होना चाहिए "यह" पैरामीटर या तो मूल्य या संदर्भ के रूप में होना चाहिए। इस तरह के विस्तार तरीकों से अपरिवर्तनीय वर्ग प्रकार प्रारंभिकता के संबंध में मूल्य प्रकारों की तरह व्यवहार करने की अनुमति देंगे, और सामान्य 'विधि' वाक्यविन्यास को संरचना उत्परिवर्तनों पर पढ़ने के लिए केवल पढ़ने-योग्य संदर्भों में लागू होने के जोखिम के बिना उपयोग करने की अनुमति होगी। – supercat

+0

@supercat यदि आप कक्षा में एक विस्तार विधि को स्वयं कार्य करने के लिए परिभाषित कर सकते हैं, तो यह एक विस्तार विधि नहीं होगी? –

1

क्योंकि कल्पना इतनी कहती है ... अब संभवतः अच्छे कारण हैं कि उन्होंने इस तरह के भाषण को क्यों लिखा।

कारण सामान्य वर्गों में उन्हें घोषित नहीं किया जा सकता है, यह स्पष्ट है: जिस तरह से विस्तार विधियों को बुलाया जाता है, आप कक्षा के लिए प्रकार तर्क कहां निर्दिष्ट करेंगे?

कारण यह एक स्थिर वर्ग होना चाहिए क्योंकि यह स्पष्ट है, लेकिन मुझे लगता है कि यह समझ में आता है। स्थैतिक वर्गों के लिए मुख्य उपयोग केस एक साथ सहायक तरीके समूहबद्ध करना है (उदा। Path, Directory, ProtectedData ...), और विस्तार विधियां मूल रूप से सहायक तरीके हैं। उदाहरण के लिए, Enumerable या Queryable का उदाहरण बनाने में सक्षम होने के लिए यह समझ में नहीं आता है।

+0

मैं समझता हूं कि स्पेक क्या कहता है। मुझे यह जानने में दिलचस्पी है कि यह डिज़ाइन निर्णय क्यों लिया जाता है। – Mehran

+0

@ मेहरान, यही वही है जो मैंने अपने जवाब में व्याख्या करने की कोशिश की ... मैंने कल्पना नहीं की कि स्पेक क्या कहता है। –

+1

सार्वजनिक विस्तार विधियां केवल शीर्ष-स्तरीय स्थैतिक वर्ग में सार्थक होंगी, लेकिन नियमों ने स्पष्ट रूप से नेस्टेड निजी या संरक्षित वर्गों में विस्तार विधियों को घोषित करने की अनुमति दे दी है, इस तरह के तरीकों से केवल दृश्यमान उपयोग किया जा सकता है। उदाहरण के लिए, 'Foo ' वर्ग के लिए कोड को एक एक्सटेंशन विधि को परिभाषित करने में सक्षम होने से लाभ हो सकता है जो 'Foo ' के लिए निजी प्रकार का उपयोग करता है। इस तरह के एक विस्तार विधि को 'टी' का उपयोग करने के बारे में कोई समस्या नहीं होगी, क्योंकि एकमात्र कोड जो देख सकता है वह उस प्रकार उपलब्ध होगा। – supercat

3

नेट सी # विनिर्देश के इस टुकड़े के लिए एक नज़र डालें:

जब एक विधि के पहले पैरामीटर शामिल हैं इस संशोधक, विधि एक विस्तार विधि के लिए कहा जाता है कि। विस्तार विधियां केवल गैर-जेनेरिक, गैर-नेस्टेड स्थैतिक कक्षाओं में घोषित की जा सकती हैं। किसी एक्सटेंशन विधि के पहले पैरामीटर में के अलावा कोई संशोधक नहीं हो सकता है, और पैरामीटर प्रकार पॉइंटर प्रकार नहीं हो सकता है।

और Jon Skeet's answer से इस टुकड़ा:

यह मेरे लिए स्पष्ट नहीं है क्यों इन प्रतिबंधों में से सभी आवश्यक कर रहे हैं - से संभवतः संकलक (और भाषा कल्पना) के लिए सादगी अन्य। मैं देख सकता हूं कि इसे गैर-सामान्य प्रकारों तक सीमित करने का अर्थ क्यों है, लेकिन मैं तुरंत नहीं देख सकता कि उन्हें गैर-घोंसले और स्थिर क्यों होना चाहिए। I संदिग्ध यह लुकअप नियमों को काफी सरल बनाता है यदि आप को वर्तमान प्रकार आदि में मौजूद प्रकारों के बारे में चिंता करने की ज़रूरत नहीं है, लेकिन मैं कहता हूं कि यह संभव होगा।