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




.net delegates (5)

जैसा कि आपने नोट किया है कि एक प्रतिनिधि एक विधि कॉल के लिए हस्ताक्षर बनाने का एक तरीका है। प्रतिनिधियों का उपयोग करने के कई महान उदाहरण हैं, लेकिन जिसने वास्तव में मेरा दिमाग खोला है वह यह उदाहरण है।

public delegate Duck GetDuckDelegate();

public GetDuckDelegate GiveMeTheDuckFactoryMethod(string type)
{
  switch(type)
  {
    case "Rubber":
      return new GetDuckDelegate(CreateRubberDuck);
    case "Mallard":
      return new GetDuckDelegate(CreateMallardDuck);
    default:
      return new GetDuckDelegate(CreateDefaultDuck);
  }
}

public Duck CreateRubberDuck()
{
  return new RubberDuck();
}

public Duck CreateMallardDuck()
{
  return new MallardDuck();
}

public Duck CreateDefaultDuck()
{
  return new Duck();
}

फिर इसका इस्तेमाल करने के लिए

public static void Main() {
  var getDuck = GiveMeTheDuckFactoryMethod("Rubber");
  var duck = getDuck();
}

तर्कसंगत रूप से, कारखाना पैटर्न इसके लिए एक बेहतर तरीका होगा, लेकिन मैंने बस इस उदाहरण को मक्खी पर सोचा और सोचा कि यह इस बात का साबित हुआ कि प्रतिनिधियों को वस्तुओं के रूप में कैसे माना जा सकता है

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

डुप्लिकेट:

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

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

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

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

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

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

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

//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 में ऐरे नामक एक विधि है। Array.ForEach जो एक प्रतिनिधि और सरणी लेता है, और सरणी के प्रत्येक तत्व पर प्रतिनिधि को कॉल करता है।

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

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

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

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


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

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

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


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

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

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

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


हाँ,

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

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

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

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

public event PositionReceivedEventHandler PositionReceived;  

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

PositionRecieved += new PositionReceivedEventHandler(method_Name);

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

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





delegates