C# Delegates
Introduction to C# Delegates
C# में delegate एक reference type होता है। एक delegate किसी विशेष signature (parameter list और return type) के method के reference (pointer) को represent (hold) करता है।
एक delegate को आप type safe function pointer भी कह सकते है। Delegates type safe इसलिए कहलाते है क्योंकि ये केवल उन्हीं methods का reference hold करते है जिन methods का return type और उसके parameters का type और सँख्या delegate से match होती है।
Delegate को function pointer इसलिए कहा जाता है क्योंकि ये function को refer करते है और इनके द्वारा किसी function को execute करवाया जा सकता है।
किसी भी दूसरे reference type की तरह delegate के भी instance (objects) create किये जाते है। आप delegate के instance को किसी भी compatible signature वाले method से associate कर सकते है। इसके बाद आप उस method को delegate instance के द्वारा call कर सकते है।
सभी delegate types .NET framework की Delegate class से derived होते है। Delegate types sealed होते है और उन्हें derive नहीं किया जा सकता है।
Delegates का सबसे महत्वपूर्ण feature ये है की delegate के द्वारा आप एक method को दूसरे method के अंदर parameter के रूप में pass कर सकते है। Delegates की methods को parameters के रूप में pass करने की ability आपको callback methods define करने की ability provide करती है।
Callback methods ऐसे methods होते है जो किसी certain event के completion पर execute होते है। जैसे की कोई event generate होने पर delegate के द्वारा methods automatically call किये जा सकते है।
Syntax of C# Delegates
Delegate को use करने के लिए 3 steps होते है। सबसे पहले delegate को declare किया जाता है। इसके बाद delegate को instantiate (object create करना) किया जाता है। आखिर में delegate को invoke (call) किया जाता है।
इन तीनों steps के लिए जरुरी syntax निचे दिए जा रहे है।
Declaring a Delegate
निचे C# delegates को declare करने का general syntax दिया जा रहा है।
access-modifier delegate-keyword return-type delegate-name(parameter-list);
जैसा की आप ऊपर दिए गए syntax में देख सकते है delegate को delegate keyword द्वारा declare किया जाता है। Delegate का return type वही होना चाहिए जो refer किये जाने वाले method का है। Delegate के parameters की सँख्या और उनका type भी refer किये जाने वाले method से match होना चाहिए।
Instantiating a Delegate
Delegate को declare करने के बाद उसका instance create किया जाता है। एक delegate का instance method का नाम provide करके create किया जाता है। यह उस method का नाम होता है जिसे आप delegate के द्वारा refer करना चाहते है।
एक बार object create होने के बाद जब delegate को call किया जाता है तो वह call method को delegate द्वारा pass किया जाता है।
Delegate को pass किये गए arguments भी method को pass कर दिए जाते है। यदि method कोई value return करता है तो वह value delegate के caller को return हो जाती है।
किसी Delegate का instance आप दो तरह से create कर सकते है। पहले तरीके में आप किसी class के object की तरह new keyword के द्वारा delegate का object create कर सकते है। इसका syntax निचे दिया जा रहा है।
delegate-name object-name = new-keyword delegate-name(class-object.method-name);
दूसरे तरीके में आप बिना new keyword के भी delegate का instance create कर सकते है। इसका syntax निचे दिया जा रहा है।
delegate-name object-name = class-object.method-name;
दोनों ही तरीकों द्वारा delegate का instance create होता है और दोनों ही तरीकों में जिस method को आप refer करना चाहते है उसका नाम define करना होता है।
यदि method non-static है तो उसे आप class object के द्वारा define करते है। यदि method static है तो उसे class के नाम के द्वारा define किया जाएगा।
Invoking Delegate
एक बार delegate का object create करने के बाद आप उस object को actual method की तरह use (call) कर सकते है। इसका syntax निचे दिया जा रहा है।
delegate-object-name(argument);
Delegate को invoke (call) करते समय किसी normal method की ही तरह उसमे arguments pass किये जाते है।
Passing Delegate as Argument
एक delegate object को आप किसी method में argument के रूप में pass कर सकते है। जिस प्रकार normal variables को parameter के रूप में define करते समय आप उनके type int, float आदि define करते है उसी तरह delegate का नाम type के रूप में use किया जाता है और उसके बाद parameter का नाम लिखा जाता है। इसका syntax निचे दिया जा रहा है।
access-modifier return-type method-name(delegate-name paramter-name, other-paramter-list)
{
//Function code here…
}
Example of C# Delegates
C# में delegates के use को एक simple उदाहरण द्वारा समझाया जा रहा है।
using System;
public delegate string printDelegate(); //delegate declaration
class delegateDemo
{
public string printMethod() //Method that is associated with delegate
{
return “Hello”;
}
public string delegateMethod(printDelegate del) //method that take delegate as argument
{
string msg;
msg=del();
return msg;
}
}
class delegateDemoFinal
{
static void Main(string[] args)
{
string msg;
delegateDemo dd = new delegateDemo(); //Class object
printDelegate del = new printDelegate(dd.printMethod); // Delegate object
msg=dd.delegateMethod(del); //Calling class method by passing delegate as parameter
Console.WriteLine(msg);
}
}
ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।
Hello
C# Multicast Delegates
अभी तक आपने normally एक delegate object से सिर्फ एक ही method को execute किया है। लेकिन delegate object द्वारा एक से अधिक methods को भी execute किया जा सकता है।
एक से अधिक methods को एक delegate द्वारा call करने के लिए आप assignment operator द्वारा दो delegate objects को combine कर सकते है और उसे तीसरे delegate को assign कर सकते है।
जब आप third delegate object को invoke करेंगे तो बाकी दो delegate objects automatically invoke हो जाएंगे। इसका syntax निचे दिया जा रहा है।
delegate-name dobj1 = method-name;
delegate-name dobj2 = method-name;
delegate-name dobj3 = dobj1+dobj2;
dobj3(); // Will execute methods of dobj1 and dobj2
सभी delegates निश्चित order में invoke किये जाते है। यदि delegates कोई value return करते है तो आखिरी delegate द्वारा return की गयी value ही return होती है।
किसी भी delegate को group से remove करने के लिए subtraction operator use किया जाता है। इसका symbol निचे दिया जा रहा है।
dobj3 -= dobj1;
Multicast delegates को निचे उदाहरण द्वारा समझाया जा रहा है।
using System;
public delegate void vDelegate();
class delegateMethodClass
{
public void hello()
{
Console.Write(“Hello “);
}
public void world()
{
Console.WriteLine(“World”);
}
}
class myMainClass
{
static void Main(string[] args)
{
delegateMethodClass dMC = new delegateMethodClass();
vDelegate vd1 = dMC.hello;
vDelegate vd2 = dMC.world;
vd1 += vd2;
vd1();
}
}
ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।
Hello World