C # में स्थिर विधियों के लिए औपचारिक मापदंडों में "इस" कीवर्ड का उपयोग


286

मैं निम्नलिखित जैसे C # कोड के कई उदाहरणों में आया हूं:

public static int Foo(this MyClass arg)

मैं thisइस मामले में कीवर्ड का क्या अर्थ है, इसका स्पष्टीकरण नहीं पा सका हूँ । कोई अंतर्दृष्टि?


10
C # एक्सटेंशन मेथड के लिए स्वीकृत उत्तर के अलावा, आधिकारिक MSDN प्रलेखन की जांच करनी चाहिए ।
वल्केन रेवेन

4
एक्सटेंशन के तरीके सुविधाजनक हैं लेकिन हमें उन्हें बनाते / उपयोग करते समय सावधानी बरतनी चाहिए - वे टूट सकते हैं! आधिकारिक MSDN प्रलेखन में सामान्य दिशानिर्देशों से उद्धरण : "सामान्य तौर पर, हम अनुशंसा करते हैं कि आप विस्तार विधियों को संयम से लागू करें और केवल जब आपको करना हो ... एक प्रकार का विस्तार करने के लिए एक्सटेंशन विधि का उपयोग करते समय जिनके स्रोत कोड को आप बदल नहीं सकते हैं, आप उस जोखिम को चलाएं जिस प्रकार के कार्यान्वयन में परिवर्तन से आपकी एक्सटेंशन विधि टूट जाएगी। "
कृष्णा गुप्ता

क्या इसका मतलब यह संभव होगा? क्योंकि यही मैं ढूंढ रहा हूं।
फेसपालम ४२

जवाबों:


274

यह एक विस्तार विधि हैस्पष्टीकरण के लिए यहां देखें ।

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

एक्सटेंशन मेथड विभिन्न प्रकार के उपयोगी परिदृश्यों को सक्षम करते हैं, और वास्तव में शक्तिशाली LINQ क्वेरी फ्रेमवर्क को संभव बनाने में मदद करते हैं ...।

इसका मतलब है कि आप कॉल कर सकते हैं

MyClass myClass = new MyClass();
int i = myClass.Foo();

बजाय

MyClass myClass = new MyClass();
int i = Foo(myClass);

यह नीचे दिए गए धाराप्रवाह इंटरफेस के निर्माण की अनुमति देता है ।


उप-वर्गीकरण कठिन है
गेरी

@ जीरी - क्या मतलब?
प्रीत संग

9
क्षमा करें, थोड़ा व्यंग्य - इन दिनों बहुत सारे वाक्यविन्यास समस्याओं को हल करने के लिए प्रतीत होते हैं जो मुझे पता भी नहीं था कि समस्याएं थीं। पठनीयता बहुत उच्च प्राथमिकता होनी चाहिए।
गेरी

2
ईमानदार होने के लिए @Gerry, यह एक तरह का लगता है जैसे आप एक क्लासिक ब्लूब पैराडॉक्स में हैं । इन दिनों बहुत सारे वाक्यविन्यास समस्याएँ हल करते हैं जो आप नहीं कर रहे हैं क्योंकि आपको नहीं पता था कि एक बेहतर तरीका है, या आप इस तरह का कार्य नहीं कर रहे हैं जिसके लिए यह वाक्यविन्यास भयानक है। ' यह एक समस्या की तलाश में एक समाधान है ’के बारे में अधिकांश टिप्पणियां वास्तव में' मुझे नहीं पता कि यह कैसे काम करता है, इसलिए यह बेकार है ’।
मिरडिन इमरोज़

53

स्कॉट गु के उद्धृत ब्लॉग पोस्ट यह अच्छी तरह से बताते हैं।

मेरे लिए, प्रश्न का उत्तर उस पोस्ट में निम्नलिखित कथन में है:

ध्यान दें कि किस प्रकार की स्टैटिक विधि में टाइप स्ट्रिंग के पहले पैरामीटर तर्क से पहले "यह" कीवर्ड है। यह संकलक को बताता है कि इस विशेष एक्सटेंशन विधि को "स्ट्रिंग" प्रकार की वस्तुओं में जोड़ा जाना चाहिए। IsValidEmailAddress () मेथड इम्प्लीमेंटेशन के बाद मैं सभी सार्वजनिक प्रॉपर्टीज / मेथड्स / वास्तविक स्ट्रिंग इंस्टेंस के ईवेंट्स तक पहुंच सकता हूं, जिस पर मेथड को कॉल किया जा रहा है, और यह मान्य ईमेल है या नहीं, इस आधार पर सही / गलत रिटर्न करें।


9
यह स्वीकृत उत्तर होना चाहिए। यह एकमात्र उत्तर है जो वास्तव में बताता है कि thisविधि हस्ताक्षर में कीवर्ड का वास्तविक उद्देश्य क्या है। अन्य जवाब केवल अनायास कहते हैं "यह एक विस्तार विधि है।" मैं कभी भी पूरी तरह से समझ नहीं पाया कि इस उत्तर को पढ़ने तक वे किस तरह से विस्तार के तरीके "संलग्न" करते हैं। धन्यवाद!
लुइस थेरिन

13

प्रीत संघ की व्याख्या के अलावा:
Intellisense नीले तीर के साथ विस्तार के तरीकों को प्रदर्शित करता है (उदाहरण के लिए "एग्रीगेट <>" के सामने):

यहां छवि विवरण दर्ज करें

आपको ज़रूरत है एक

using the.namespace.of.the.static.class.with.the.extension.methods;

एक्सटेंशन विधियों को प्रदर्शित करने और उपलब्ध होने के लिए, यदि वे कोड का उपयोग करने की तुलना में एक अलग नामस्थान में हैं।



4

मैंने दूसरे दिन ही इसे स्वयं सीखा: यह खोजशब्द उस पद्धति को परिभाषित करता है जिसमें उस वर्ग का विस्तार होता है जो इसे आगे बढ़ाता है। तो आपके उदाहरण के लिए, MyClass के पास फू नामक एक नई एक्सटेंशन विधि होगी (जो किसी भी पैरामीटर को स्वीकार नहीं करता है और एक रिटर्न देता है; इसे किसी अन्य सार्वजनिक विधि के रूप में उपयोग किया जा सकता है)।


1

"यह" पैरामीटर सूची में अगली कक्षा का विस्तार करता है

तो नीचे विधि हस्ताक्षर में "यह" "स्ट्रिंग" का विस्तार करता है। विधि के लिए एक सामान्य तर्क के रूप में लाइन फ़ंक्शन को पास की जाती है। सार्वजनिक स्थैतिक स्ट्रिंग [] स्प्लिट्सविलाइन (यह स्ट्रिंग लाइन)

उपरोक्त उदाहरण में "यह" वर्ग निर्मित "स्ट्रिंग" वर्ग में विस्तारित हो रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.