c# प्रतिनिधियों का उद्देश्य




.net delegates (6)

प्रतिनिधियों को समझाते हुए बहुत सारे उत्कृष्ट लेख हैं - यहां कुछ अच्छे हैं:

प्रतिनिधियों और घटनाओं
सी # प्रतिनिधियों समझाया
सी # में प्रतिनिधियों

इस प्रश्न का उत्तर यहां दिया गया है:

डुप्लिकेट:

घटनाओं और प्रतिनिधियों और इसके संबंधित अनुप्रयोगों के बीच अंतर

प्रतिनिधियों के फायदे क्या हैं?

मैं प्रतिनिधियों का उपयोग कहां करूं?

मुझे आश्चर्य है कि प्रतिनिधियों का उद्देश्य क्या है। मैंने उन्हें इतना उपयोग नहीं किया है और वास्तव में कुछ नहीं सोच सकता।

मेरे पाठ्यक्रमों में, यह लिखा गया है कि एक प्रतिनिधि अपने हस्ताक्षर का अनुपालन करने वाली सभी विधियों के लिए एक नीला प्रिंट है।

साथ ही, आप एक प्रतिनिधि को कई विधियों को जोड़ सकते हैं, और फिर उन्हें जोड़े गए क्रम में एक दूसरे के बाद निष्पादित किया जाएगा। जो संभवतः उन तरीकों के लिए उपयोगी है जो स्थानीय चर या मेथोड को प्रभावित करते हैं जो किसी भी मूल्य को वापस नहीं करते हैं।

मैंने पढ़ा है कि सी # घटनाक्रम के रूप में घटनाक्रम लागू करता है, जिसे इस प्रकार दस्तावेज किया गया है:

//Summary: Represents the method that
will handle an event that has no event
data.

//Parameters:

//sender: The source of the event.

//e: An System.EventArgs that contains no event data.

[Serializable]

[ComVisible(true)] 

public delegate void EventHandler(object sender, EventArgs e);

फिर भी, यह थोड़ी उलझन में है। क्या कोई इस अवधारणा का अच्छा, उपयोगी उदाहरण दे सकता है?


हाँ,

तुम लगभग वहां थे। एक प्रतिनिधि एक विधि या समारोह को संदर्भित करता है जिसे बुलाया जाता है। .NET घटनाओं का उपयोग कहने के लिए करता है .. जब कोई इस बटन को दबाता है, तो मैं चाहता हूं कि आप कोड के इस टुकड़े को निष्पादित करें।

उदाहरण के लिए, जीपीएस एप्लीकेशन के उपयोग में:

public delegate void PositionReceivedEventHandler(double latitude, double longitude);

यह कहता है कि विधि को इनपुट के रूप में दो युगल लेना चाहिए, और शून्य वापस करना चाहिए। जब हम किसी ईवेंट को परिभाषित करने के लिए आते हैं:

public event PositionReceivedEventHandler PositionReceived;  

इसका अर्थ यह है कि पोजीशनसीड इवेंट, परिभाषा के अनुसार एक परिभाषा के साथ एक विधि को परिभाषित करता है जैसा कि PositionReceivedEventHandler प्रतिनिधि है जिसे हमने परिभाषित किया है। तो जब आप करते हैं

PositionRecieved += new PositionReceivedEventHandler(method_Name);

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

उम्मीद है कि कुछ मदद करता है ...


प्रतिनिधियों, मेरी समझ के लिए, बिना किसी वर्ग के कक्षा के व्यवहार को विशेषज्ञता का एक तरीका प्रदान करता है।

कुछ वर्गों में जटिल सामान्य व्यवहार होता है, लेकिन अभी भी विशिष्ट होने का मतलब है। एक जीयूआई ढांचे में एक विंडो वर्ग के बारे में सोचें: एक खिड़की अपने आप पर बहुत कुछ कर सकती है, लेकिन आप शायद इसे किसी भी तरह से विशेषज्ञ बनाना चाहते हैं। कुछ ढांचे में, यह विरासत के माध्यम से किया जाता है। ऐसा करने का एक अलग तरीका प्रतिनिधियों के साथ है। मान लें कि खिड़की का आकार बदलने पर आप कुछ करना चाहते हैं: आपका प्रतिनिधि वर्ग ऑनविंडो रीसाइज नामक एक विधि को कार्यान्वित कर सकता है (बशर्ते कि विंडो क्लास इसका समर्थन करता हो), जिसे खिड़की का आकार बदलता है और विंडो के किसी विशेष व्यवहार के लिए ज़िम्मेदार होता है आकार बदलता है।

मैं विरासत पर प्रतिनिधिमंडल की योग्यता पर बहस नहीं करने जा रहा हूं, लेकिन यह कहने के लिए पर्याप्त है कि ऐसे कई लोग हैं जो महसूस करते हैं कि प्रतिनिधिमंडल विरासत से "क्लीनर" है।


शुरुआत में कई लोग प्रतिनिधियों और घटनाओं की वास्तविक आवश्यकता के साथ भ्रमित हो जाते हैं। मैं उनमें से एक था और मुझे इसे समझने में कुछ समय लगा :-)। हाल ही में एएसपी.नेट मंचों में एक समान प्रश्न का उत्तर दिया और सोचा कि अगर मैं इस विषय पर ब्लॉग पोस्ट बनाउंगा तो यह अच्छा होगा! यहां प्रश्न था:

"मैं बैंक कक्षा के कहीं एक उदाहरण पढ़ रहा था कि यदि न्यूनतम शेष राशि तक पहुंच जाती है तो आपको शेष ऐप को सूचित करने की आवश्यकता होती है कि मिनट पहुंच गया है, लेकिन हम सामान्य विधि को बुलाकर ऐसा नहीं कर सकते हैं। उदाहरण के लिए: आइए कहें कि जब हम शेष राशि से कुछ राशि घटाते हैं और यदि न्यूनतम पहुंचे तो कुछ कार्रवाई करने के लिए कुछ विधि बुलाएं, मुझे पूरी तरह याद आ रही है कि हमें यहां प्रतिनिधियों और कस्टम कार्यक्रमों की आवश्यकता क्यों है? "

बात बैंक के मामले में है, आप निश्चित रूप से एक विधि को कॉल कर सकते हैं, लेकिन फिर यह सरल प्रक्रियात्मक प्रोग्रामिंग होगा, हमें ईवेंट आधारित प्रोग्रामिंग की आवश्यकता होगी जब हम चाहते हैं कि हमारे कोड सिस्टम द्वारा उत्पन्न कुछ घटनाओं का जवाब दें।

उदाहरण के लिए: सोचें कि विंडोज ओएस एक सिस्टम है, और हम एक कोड (किसी भी भाषा में) लिख रहे हैं जहां हम mouse_click () जैसे ईवेंट को कैप्चर करना चाहते हैं। अब हमारे कार्यक्रम को कैसे पता चलेगा कि एक माउस क्लिक हुआ है? हम इसके लिए निम्न स्तर कोड का उपयोग कर सकते हैं, लेकिन चूंकि ओएस पहले से ही निम्न स्तर कोड को संभालने वाला है, ओएस द्वारा उठाए गए एक ईवेंट को कैप्चर करने के लिए सबसे अच्छा है।

दूसरे शब्दों में, एक माउस_क्लिक () होता है जब ओएस एक घटना को आग लगती है। ओएस इस परवाह नहीं करता है कि इस घटना को कैप्चर करता है और इसका उपयोग करता है, यह सिर्फ एक अधिसूचना भेजता है। फिर कोई भी कोड (जैसे हमारी) उस घटना को कैप्चर कर सकता है और तदनुसार इसका उपयोग कर सकता है। यह हमें अपने लिए कोड लिखने के लिए बहुत समय बचाता है। और अन्य कार्यक्रम भी एक ही घटना का उपयोग कर सकते हैं और तदनुसार इसे संभाल सकते हैं।

इसी प्रकार, बैंकिंग प्रणाली बहुत बड़ी हो सकती है, और कई अन्य बाहरी अनुप्रयोग इसे एक्सेस कर सकते हैं। बैंकिंग प्रणाली यह नहीं जानती कि ऐसे कितने अनुप्रयोग हैं जिनके लिए इसकी आवश्यकता है, या इस पर निर्भर हैं, और कुछ स्थितियों को कैसे संभालेंगे जैसे संतुलन कम है, इसलिए जब भी कम संतुलन होता है तो यह केवल एक घटना को सक्रिय करता है, और यह घटना बैंकिंग कोड के अलावा, किसी भी अन्य कोड द्वारा इस्तेमाल किया जाना चाहिए।

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

उम्मीद है कि यह चीजों को थोड़ा सा साफ़ करता है!


प्रतिनिधि आपको मूल्यों के चारों ओर तरीकों को पारित करने की अनुमति देते हैं।

उदाहरण के लिए, .Net में ऐरे नामक एक विधि है। Array.ForEach जो एक प्रतिनिधि और सरणी लेता है, और सरणी के प्रत्येक तत्व पर प्रतिनिधि को कॉल करता है।

इसलिए, आप लिख सकते हैं,

int[] arr = new int[] { 1, 2, 4, 8, 16, 32, 64 };
Array.ForEach(arr, new Action<int>(Console.WriteLine));

यह कोड सरणी में प्रत्येक नंबर के लिए Console.WriteLine को कॉल करेगा।

ऐसे कई काम हैं जो आप प्रतिनिधियों को ले कर काम कर सकते हैं, खासकर जब अज्ञात तरीकों से मिलते हैं। उदाहरण के लिए, LINQ


मैं आपको वेब अनुप्रयोग आर्किटेक्चर का उपयोग करके एक उदाहरण प्रदान कर सकता हूं:

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

  • प्रमाणीकरण प्रतिनिधि
  • उपयोगकर्ता प्रबंधन प्रतिनिधि

और इसी तरह। तो यह लॉजिकल हिस्सों में प्रतिनिधियों को विभाजित करने का एक साफ तरीका है - प्रतिनिधियों। स्ट्रूट्स फ्रेमवर्क काम करने के तरीके (एक्शन सर्वलेट और एक्शन क्लासेस) पर आधारित है।





delegates