में विस्तार विधियों का उपयोग करने की लागत/लाभ का मूल्यांकन करना क्या परिस्थितियों (उपयोग परिदृश्य) आप किसी ऑब्जेक्ट को उप-वर्गीकृत करने के बजाय एक्सटेंशन लिखना चुनेंगे?सी # => 3.0
< पूर्ण प्रकटीकरण: मैं एक एमएस कर्मचारी नहीं हूं; मैं व्यक्तिगत रूप से मित्सु फुरोटा नहीं जानता; मैं यहां उल्लिखित ओपन-सोर्स कंपोनैक्स लाइब्रेरी के लेखक को जानता हूं, लेकिन मेरे पास उनके साथ कोई व्यापारिक व्यवहार नहीं है; मैं विस्तार नहीं कर रहा हूं, या एक्सटेंशन का उपयोग करके कोई वाणिज्यिक उत्पाद बनाने की योजना नहीं बना रहा हूं: योग में: यह पोस्ट शुद्ध बौद्धिक जिज्ञासा से है (लगातार) "सर्वोत्तम प्रथाओं" के बारे में जागरूक हो जाती है>
मुझे यह विचार मिलता है विस्तार विधियां "शांत", और स्पष्ट रूप से आप उनके साथ "दूर-दूर" चीजें कर सकते हैं जैसे कि मित्सु फूरोटा (एमएस) ब्लॉग पोस्ट link text में आप कई उदाहरणों में कर सकते हैं।
एक निजी मित्र ने ओपन-सोर्स कंपोनैक्स लाइब्रेरी link text लिखा, और वहां कुछ उल्लेखनीय सुविधाएं हैं; लेकिन वह कोड छोटी दिशाओं पर कुल नियंत्रण के साथ अपनी छोटी कंपनी के पूर्ण आदेश में है, और कोड की हर पंक्ति "अपने हाथों से गुज़रती है।"
हालांकि यह मेरे हिस्से पर अटकलें है: मुझे लगता है कि अनुमान लगाया जा सकता है कि अन्य मुद्दों को मध्यम-से-बड़ी सॉफ़्टवेयर टीम की स्थिति में विस्तार का उपयोग किया जा सकता है।
link text में एमएस के दिशा निर्देशों को देखते हुए, आप पाते हैं:
सामान्य तौर पर, आप शायद अपने खुद को लागू करने से बुला विस्तार तरीकों में कहीं अधिक अक्सर हो जाएगा। ... सामान्य रूप से, हम अनुशंसा करते हैं कि आप विस्तार विधियों को और केवल तभी लागू करें जब आपको करना होगा। जब भी संभव हो, तो क्लाइंट कोड जो को मौजूदा प्रकार का विस्तार करना चाहिए मौजूदा प्रकार से व्युत्पन्न एक नया प्रकार बनाना चाहिए। अधिक जानकारी के लिए, विरासत देखें (सी # प्रोग्रामिंग मार्गदर्शिका)। ... जब संकलक एक विधि आमंत्रण का सामना करता है, तो यह पहले प्रकार के इंस्टेंस विधियों में एक मैच की तलाश करता है। यदि कोई मिलान नहीं मिला है, तो यह एक्सटेंशन विधियों की खोज करेगा जो कि प्रकार के लिए परिभाषित हैं, और पहले एक्सटेंशन विधि से जुड़ें जो इसे पाता है।
और एमएस के link text पर:
एक्सटेंशन तरीकों कोई विशेष सुरक्षा कमजोरियों प्रस्तुत करते हैं। वे किसी भी प्रकार के मौजूदा विधियों का प्रतिरूपण करने के लिए कभी भी उपयोग नहीं किए जा सकते हैं, क्योंकि सभी नाम टकराव के पक्ष में हल किए गए हैं उदाहरण के लिए परिभाषित या स्थिर विधि। विस्तार विधियां विस्तारित कक्षा में किसी भी निजी डेटा तक नहीं पहुंच पाती है।
कारक है कि मेरे लिए स्पष्ट प्रतीत शामिल होंगे:
मुझे लगता है जब तक आप उम्मीद यह बहुत आम तौर पर और बहुत बार इस्तेमाल किया जा अगर आप एक्सटेंशन नहीं लिखेंगे।दूसरी ओर: क्या आप उप-वर्गीकरण के बारे में एक ही बात नहीं कह सकते?
जानना हम उन्हें एक अलग डीएल में संकलित कर सकते हैं, और संकलित डीएलएल जोड़ सकते हैं, और इसका संदर्भ ले सकते हैं, और फिर एक्सटेंशन का उपयोग करें: "ठंडा" है, लेकिन क्या यह पहले संकलक में निहित लागत को "शेष" करता है यह देखने के लिए जांच करनी है कि उपरोक्त वर्णित उदाहरण विधियों को परिभाषित किया गया है या नहीं। या लागत, "नाम संघर्ष" के मामले में, स्टेटिक आमंत्रण विधियों का उपयोग करने के लिए यह सुनिश्चित करने के लिए कि आपका एक्सटेंशन आवृत्ति परिभाषा के बजाय बुलाया गया हो?
एक्सटेंशन का कितनी बार उपयोग रन-टाइम प्रदर्शन या स्मृति उपयोग को प्रभावित करेगा: मुझे कोई जानकारी नहीं है।
तो, मैं आपके विचारों की सराहना करता हूं, या आप कैसे/कब करते हैं, या नहीं करते हैं, उप-वर्गीकरण की तुलना में एक्सटेंशन का उपयोग करते हैं।
धन्यवाद, बिल
बहुत सारे और अन्य एक ही विषय को कवर कई प्रश्न: http://stackoverflow.com/questions/487904/what-advantages-of-extension-methods-have-you-found – snicker
"कैसे लगातार एक्सटेंशन का प्रयोग करेंगे रन-टाइम प्रदर्शन या स्मृति उपयोग को प्रभावित करें: मुझे कोई जानकारी नहीं है। " - यह किसी भी तरह से किसी को प्रभावित नहीं करता है। एक स्थैतिक विधि आविष्कार बिल्कुल गैर-आभासी, गैर-इंटरफ़ेस उदाहरण विधि के आविष्कार के समान ही तर्क के समान होता है (बाद के मामले में अंतर्निहित 'यह' गिनती)। –