2011-04-20 11 views
8

एक्सटेंशन के तरीके के बारे में कुछ सवाल:एक्सटेंशन विधियों के लिए "स्थैतिक" और "यह" क्यों आवश्यक हैं, और उनकी याददाश्त कैसे आवंटित की जाती है?

  1. क्यों एक्सटेंशन के तरीके स्थिर कर रहे हैं?

  2. उन्हें स्थिर वर्ग में घोषित करने की आवश्यकता क्यों है?

  3. यह कीवर्ड विस्तार विधि की पैरामीटर सूची में क्या इंगित करता है? चूंकि यह एक स्थिर वर्ग है "इस" कीवर्ड इस संदर्भ में कैसे काम करता है?

  4. इस प्रकार के तरीकों के लिए स्मृति आवंटन कैसे होता है? this -

+4

http://msdn.microsoft.com/en-us/library/bb383977.aspx – Gabriel

+0

मैं विशेष रूप से विस्तार विधियों के स्मृति आवंटन पहलू में रूचि रखता हूं, क्योंकि linq इन्हें हर जगह उपयोग करता है। –

+0

शो ** CompilerServices.ExtensionAttribute ** – V4Vendetta

उत्तर

8

एक स्थिर और एक गैर स्थैतिक विधि के बीच फर्क सिर्फ इतना है कि एक गैर स्थैतिक विधि एक अंतर्निहित पैरामीटर प्राप्त करता है। ऑब्जेक्ट के संदर्भ में एक्सटेंशन विधियों को कॉल नहीं किया जाता है जिस पर विधि घोषित की जाती है, इसलिए उन्हें this संदर्भ पास करने का कोई तरीका नहीं है, इसलिए उन्हें स्थिर होना चाहिए।

आप एक विस्तार विधि के अंदर कीवर्ड this का उपयोग नहीं कर सकते हैं, मुझे उम्मीद है कि यह आपके तीसरे प्रश्न का उत्तर देगा। पैरामीटर सूची में this कीवर्ड यह इंगित करने के लिए है कि यह विधि किस प्रकार का विस्तार करती है।

स्मृति आवंटन के बारे में आपका प्रश्न क्या है? एक विस्तार विधि किसी अन्य स्थिर विधि की तरह ही है, केवल कॉल सिंटैक्स अलग है।

+0

हम्म, सामान्य गैर स्थैतिक तरीकों को एक अंतर्निहित 'यह' पैरामीटर भी नहीं मिलता है? या यह एक कार्यान्वयन विस्तार है जो सी ++ के लिए विशिष्ट है? –

+0

@ कोडी हां, वे करते हैं।किसी कारण से @ रॉबर्ट हार्वे ने मेरा जवाब कुछ गलत और अलग से संपादित किया जो मेरा मतलब था। मैंने इसे वापस लुढ़काया। –

0

यह वही है कि उन्हें परिभाषित किया गया है - इस पैरामीटर के पहले पैरामीटर से पहले, जो उस ऑब्जेक्ट का उदाहरण है जिसे आप विधि पर कॉल कर रहे हैं। ToString() को ToString() क्यों कहा जाता है? स्थैतिक के लिए स्थिर क्यों उपयोग किया जाता है? घास हरा क्यों है? मुझे लगता है कि विधि नाम के सामने रखने के लिए एक नए कीवर्ड "एक्सटेंशन" के साथ आने के बजाय, पहले पैरामीटर के सामने इसे रखने का अधिकार है।

कंपाइलर द्वारा उत्पन्न आईएल-स्थिर कोड पर आपके कोड का अनुवाद करता है, भले ही वाक्यविन्यास एक उदाहरण विधि पर कॉल जैसा दिखता हो। लेकिन यह नहीं है - यह एक स्थिर है, जिसके पास आपके ऑब्जेक्ट के निजी सदस्यों तक कोई पहुंच नहीं है।

1
  1. क्योंकि उन्हें कॉल करने के लिए कोई उदाहरण नहीं है।

  2. मुझे लगता है कि यह गैर-स्थैतिक वर्ग में घोषित होने पर संभावित त्रुटियों की संख्या सीमित करने के लिए है।

  3. यह इसकी विस्तार विधि कहता है। कंपाइलर इसे देखता है और इसके रूप में घोषित प्रकार पर इसे स्थिर विधि के रूप में उपयोग करने की अनुमति देता है।

  4. विस्तार विधि कॉल केवल वाक्य रचनात्मक चीनी है। यह कॉल आईएल में सामान्य स्थैतिक विधि कॉल में परिवर्तित हो जाता है।

1

1,2, और 4 का उत्तर काफी समान है। विस्तार विधियां कुछ विशेष वाक्य रचनात्मक चीनी के साथ बस स्थिर तरीके हैं।यह:

public static void DoIt(string str) { 
    // .. 
} 

DoIt("test"); 

पूर्व विधि यह बहुत आसान है, हालांकि IntelliSense समर्थन प्रदान करने के बनाता है:

public static void DoIt(this string str) { 
    // .. 
} 

"test".DoIt(); 

प्रभावी रूप से के रूप में ही आईएल है। वर्ग की प्रतिबंध स्थिर होने की आवश्यकता है शायद यह सिर्फ एक डिजाइन निर्णय है, या शायद प्रदर्शन से संबंधित है।

# 3 का उत्तर यह है कि भाषा डिजाइनरों ने सिर्फ वाक्यविन्यास चुना है। सी # डेवलपर्स को this पर आवृत्ति ऑब्जेक्ट को रेफर करने के लिए उपयोग किया जाता है। वे इसे blah कह सकते थे, लेकिन यह स्पष्ट नहीं था कि इंस्टेंस ऑब्जेक्ट क्या है।

एक विस्तार विधि में इस कीवर्ड का उपयोग करने से सी # कंपाइलर को ExtensionAttribute के साथ चिह्नित करने के लिए भी कहा जाता है। यह विशेषता विस्तार विधियों को खोजने के लिए असेंबली के उपभोक्ताओं द्वारा उपयोग की जाती है।

2

एक्सटेंशन विधियां स्थिर क्यों हैं?

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

उन्हें स्थिर वर्ग में घोषित करने की आवश्यकता क्यों है?

क्योंकि हम कक्षा के उदाहरण बनाने के लिए नहीं हैं। यह एक डिजाइन निर्णय है। उन चीजों को जटिल क्यों करें जिनके पास कुछ वर्गों के उदाहरण हैं जिनके पास विस्तारित विधियां हैं जो संभवतः उपयोग योग्य नहीं हो सकती हैं?

यह कीवर्ड एक्सटेंशन विधि की पैरामीटर सूची में क्या इंगित करता है? चूंकि यह एक स्थिर वर्ग है "इस" कीवर्ड इस संदर्भ में कैसे काम करता है?

यह एक स्थिर विधि है। इस संदर्भ में this का कोई मतलब नहीं है। हस्ताक्षर में this यह इंगित करने का एक तरीका है कि एक विस्तार विधि घोषित की जा रही है।

इस प्रकार के तरीकों के लिए स्मृति आवंटन कैसे होता है?

इस बारे में उलझन में। वे स्थिर वर्ग पर सभी स्थिर तरीके हैं। वे किसी भी अन्य (स्थैतिक) विधि की तरह "आवंटित" हैं, इस प्रकार के लिए कोड की केवल एक प्रति है।

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