Sunday, October 10, 2021

C# Delegate, Multicast delegate and examples Anonymous methods Lambda expression


C# Delegates and their types

C# के अंतर्गत डेलीगेट (delegate) एक टाइप है। जिस प्रकार क्लास और इंटरफ़ेस टाइप होते हैं ठीक उसी प्रकार C# के अंतर्गत डेलीगेट भी एक टाइप है। 

TYPE AND NAMESPACE
हम जानते हैं कि कोई भी टाईप किसी नेमस्पेस के भीतर घोषित(declare) और डिफाइन किया जाता है। जैसे क्लास और इंटरफ़ेस को नेमस्पेस के भीतर डिफाइन करते है, ठीक उसी प्रकार डेलीगेट भी नेमस्पेस के भीतर ही घोषित और डिफाइन करते हैं। ऐसा नहीं है कि हम नेमस्पेस के भीतर ही डेलीगेट को डिफाइन कर सकते हैं। अगर हम चाहे तो किसी क्लास के भीतर भी डेलीगेट को डिक्लियर और डिफाइन कर सकते हैं। जैसा कि हम जानते हैं कि नेस्टेड टाइप के अंतर्गत एक टाइप के भीतर दूसरा टाइप होता है। उदाहरण के लिए एक क्लास के भीतर दूसरा क्लास होता है तो उसे नेस्टेड क्लास कहते हैं ठीक इसी तरह किसी क्लास के भीतर भी डेलीगेट को घोषित कर सकते हैं। 

एक टाइप के भीतर दूसरा टाइप होता है तो उसे नेस्टेड टाइप कहते हैं।

डेलीगेट एक ऐसा टाइप है जिसके द्वारा किसी मेथड को कॉल किया जाता है। जैसा कि आप जानते हैं कि क्लास के किसी मेथड को कॉल करने के लिए आमतौर पर दो तरीके हैं। अगर मेथड नॉनस्टेटिक है तो उसे कॉल करने के लिए क्लास का ऑब्जेक्ट बनाकर उस ऑब्जेक्ट के द्वारा उस मेथड को कॉल किया जाता है। इसी तरह अगर स्टैटिक मेथड है उस स्टैटिक मेथड को कॉल करने के लिए हम क्लास के नाम के द्वारा सीधे उस स्टैटिक मेथड को कॉल कर सकते हैं। इसके अलावा किसी मेथड को कॉल करने के लिए तीसरा तरीका यह है कि हम किसी डेलीगेट का यूज करें।

डेलीगेट किस तरह के मेथड को कॉल कर सकता है, इसको डेलीगेट के डिक्लेरेशन में डिफाइन किया जाता है। एक डेलीगेट का डिक्लेरेशन बिल्कुल एक मेथड की तरह होता है। जैसा कि मेथड का मेथड सिग्नेचर होता है अतः मेथड सिग्नेचर को यूज करते हुए डेलीगेट को डिक्लेअर किया जाता है। किसी मेथड के सिग्नेचर के अंतर्गत मेथड का रिटर्न टाइप, मेथड का नाम और उस मेथड से जुड़े हुए पैरामीटर्स होते हैं। अब इस मेथड सिग्नेचर में मेथड के नाम की जगह कोई उपयुक्त डेलीगेट का नाम लिख दें और रिटर्न टाइप के ठीक पहले डेलीगेट कीवर्ड यूज करें तो इस तरीके से डेलीगेट डिक्लेअर हो जाता है।

उदाहरण के लिए

public void Add(int n1, int n2); 

public void Sub(int n1, int n2); 

public void Multiply(int n1, int n2); 

इन तीनों मेथड के संगत डिलीगेट निम्न होगा

public delegate void CalcDelegate(int num1, int num2);

जिस जिस मेथड का मेथड सिग्नेचर इस डेलीगेट के मेथड सिग्नेचर से मैच करेगा उस उस मेथड को यह डेलीगेट कॉल कर सकता है। एक डिलीगेट किसी मेथड तो तभी कॉल कर सकता है जब उस मेथड का रिटर्न टाइप डिलीगेट के रिटर्न टाइप की तरह हो और मेथड का पैरामीटर डिलीगेट के पैरामीटर से पूरी तरह मैच करता हो अर्थात पैरामीटर का डाटाटाइप उनकी संख्या और क्रम आपस में समान हो।

CalcDelegate एक डिलीगेट टाइप है जो किसी ऐसे मेथड्स के रेफेरेंस को होल्ड कर सकता है जिन मेथड्स के सिग्नेचर CalcDelegate के सिग्नेचर से मैच करता हो।

जैसा कि डेलीगेट एक टाइप है अतः इसका इंस्टैंस बनाने के लिए हम new ऑपरेटर का उपयोग करते हैं जिस प्रकार क्लास इंस्टैंस new ऑपरेटर की सहायता से बनाया जाता है ठीक उसी प्रकार किसी डेलीगेट का इंस्टैंस new ऑपरेटर की सहायता से बनाया जाता है। यह बात याद रखने वाली है डेलीगेट को हमेशा फंक्शन का नाम पैरामीटर के रूप में दिया जाता है जो  उस फंक्शन को कॉल करने के लिए होता है। उदाहरण के लिए

CalcDelegate delAdd = new CalcDelegate(Add);
CalcDelegate delSub = new CalcDelegate(Sub);
CalcDelegate delMultiply = new CalcDelegate(Multiply);

ध्यान दीजिए कि जब किसी डेलीगेट का ऑब्जेक्ट बनाया जाता है तो उस समय केवल फंक्शन का नाम दिया जाता है ना कि उस फंक्शन से जुड़े पैरामीटर्स के वैल्यू को।

delAdd एक CalcDelegate डिलीगेट टाइप का ऑब्जेक्ट है जो Add मेथड के रेफेरेंस को होल्ड करता है। इसी तरह delSub एक CalcDelegate डिलीगेट टाइप का ऑब्जेक्ट है जो Sub मेथड के रेफेरेंस को होल्ड करता है। इत्यादि।

जब किसी मेथड को डेलीगेट की सहायता से कॉल करना होता है तो उस समय डेलीगेट के ऑब्जेक्ट को इन्वोक किया जाता है। मेथड को इन्वोक करते समय  पैरामीटर की वैल्यू को पास किया जाता है।

उदाहरण के लिए

delAdd.Invoke(2, 4);
delSub.Invoke(2, 4);
delMultiply.Invoke(2, 4);

यहाँ Invoke एक डिलीगेट ऑब्जेक्ट का मेथड है जो उस डिलीगेट ऑब्जेक्ट के द्वारा होल्ड किए मेथड रेफेरेंस के आधार पर मेथड को काल करता है।

इसको संक्षिप्त रूप में निम्न प्रकार से भी लिख सकते हैं

delAdd(2, 4);
delSub(2, 4);
delMultiply(2, 4);

MULTICAST DELEGATE
जैसा कि हमने देखा कि एक डिलीगेट ऑब्जेक्ट एक ही मेथड को रिफर करता है। अगर हम चाहते हैं कि कई सारे methods को एक डिलीगेट ऑब्जेक्ट द्वारा कॉल किया जाए तो इसके लिए मल्टीकास्ट डिलीगेट का यूज करना होता है। मल्टीकास्ट डिलीगेट ऐसा डिलीगेट ऑब्जेक्ट है जो कई सारे methods को रिफ़र करता है और उनको कॉल करता है। इसको हम उदाहरण की सहायता से समझ सकते हैं।

CalcDelegate delObj = Add;
delObj += Sub;
delObj += Multiply;

delObj.Invoke(2, 5);

ऊपर के उदाहरण में तीन मेथड्स को delObj द्वारा कॉल कराया गया है। ध्यान दीजिए कि बिना new ऑपरेटर के भी डिलीगेट ऑब्जेक्ट किसी मेथड को रेफेर कर सकता है।

ANONYMOUS METHOD

Anonymous मेथड delegate से जुड़ा हुआ एक विषय है। Anonymous मेथड ऐसा method है जिसका कोई नाम नहीं होता, केवल इस मेथड की बॉडी होती है जिसके भीतर method के क्रियाकलापों से संबंधित लॉजिक लिखा हुआ होता है।

फिर सवाल उत्पन्न होता है कि एनोनिमस मेथड को कैसे कॉल किया जाता है जब इसका नाम ही नहीं है।

एनोनिमस मेथड को कॉल करने के लिए delegate कीवर्ड यूज किया जाता है। एनोनिमस मेथड की बॉडी के ठीक पहले delegate कीवर्ड का यूज किया जाता है। यह बताता है कि एनोनिमस मेथड एक डिलीगेट से सम्बंधित मेथड है। इसको कॉल करने के लिए डिलीगेट ऑब्जेक्ट की जरूरत होगी। delegate कीवर्ड के बाद अगर जरूरत हो तो स्मॉल ब्रैकेट के भीतर इस मेथड के पैरामीटर को दिया जाता है। अगर एनोनिमस मेथड बिना किसी पैरामीटर के है तो उसे देने की जरूरत नहीं होती है, केवल delegate कीवर्ड के बाद मेथड की बॉडी में उसकी सारी लॉजिक लिख देते हैं। अब Anonymous मेथड को सम्बंधित delegate के ऑब्जेक्ट को assign कर दिया जाता है। इन सारी बातों को हम निम्न उदाहरण से अच्छी तरह समझ सकते हैं।

public delegate string MsgDelegate(string strMsg);
MsgDelegate objDel = delegate (string Msg)
{
return "Hello " + Msg;
}

अगर गौर से देखा जाए तो एनोनिमस मेथड एक इनलाइन मेथड होता है जिसको किसी कोड ब्लॉक के भीतर यूज किया जाता है। एनोनिमस मेथड को डेलिगेट की सहायता से कॉल किया जाता है। जैसे

objDel.Invoke("Ajeet");

Anonymous Method और Lambda Expression के लिए अगले टॉपिक C# Func, Action and Predicate Delegates को पढ़े

© अजीत कुमार, सर्वाधिकार सुरक्षित।

इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।

No comments:

Post a Comment

Hot Topics