Skip to main content

Delegates in C#


Delegates are reference types, which allow indirect calls to methods. Delegates are similar to function pointers C++, but delegates are reference types rather than value types and some single delegates can reference multiple methods. Delegates can encapsulate both static methods of a class as well as instance methods. Delegates are called single-cast delegates when they encapsulate a single method, and are called multi-cast delegates when they encapsulate more than one method. Multi-cast delegates are useful as event-handlers.

Declaring delegates: use the delegate keyword. There is no difference in the manner of declaration between single-cast and multi-cast delegates.
public delegate String MyDelegate();

Delegate Constructor: The constructor takes two arguments, where the first argument is the object whose method we are binding to the delegate and the second argument is the address of the method. For static methods we don't need to pass the first argument.

For a single-cast delegate we use the default delegate constructor
MyDelegate oFirstDelegate = new MyDelegate (t1.TestAbc); //instance method
MyDelegate oSecondDelegate = new MyDelegate (Test.TestAbc); //static method

For multi-cast delegates + and += operators has been overloaded in C# and adding a delegate to another delegate is done simply by using the + operator on any number of delegates. Similiarly for removing C# is using - and -=
oFirstDelegate = oSecondDelegate + new MyDelegate (Test.TestAbc); //using the + operator
oFirstDelegate += new MyDelegate (Test.TestAbc); //using the += operator

Sample rogram #1
In this program we will declare a single cast delegate. Our delegated is void and takes a String as argument. We'll assign an instance method of an object to the delegate and then invoke the delegate. Then we'll assign a static method of a class to the same delegate object and again invoke the delegate.

using System;
namespace Delegates
{
public class DelegateTest
{
public DelegateTest(){}
public delegate void delgTest(string sText);
public static void StaticMethod(string sText)
{ Console.WriteLine(sText); }
public void InstanceMethod(string sText)
{ Console.WriteLine(sText); }
public static void Main()
{
delgTest oDelegate = new delgTest(StaticMethod);
ShowInConsole(oDelegate);
oDelegate = new delgTest(new DelegateTest().InstanceMethod);
ShowInConsole(oDelegate);
}
public static void ShowInConsole(delgTest oDelegate)
{ oDelegate("Displayed in the Console"); }
}
}

Sample Program #2
In the example we are using a multi-cast delegate. Our delegate takes zero arguments and returns void. We'll first create two single-cast delegates, one based on an instance method and the other one based on a static method. Then we'll create our multi-cast delegate by combining the two delegates and invoke our multi-cast delegate. Now we remove one of the delegates from our multi-cast delegate and again invoke it.

public class MultiCastDelegateTest
{
public MultiCastDelegateTest(){}
public delegate void delgTest();
public static void StaticMethod()
{ Console.WriteLine("Static Method"); }
public void InstanceMethod()
{ Console.WriteLine("Instance Method"); }
public static void Main()
{
delgTest oDelegate1 = new delgTest(StaticMethod);
delgTest oDelegate2 = new delgTest(new MultiCastDelegateTest().InstanceMethod);
oDelegate1 += oDelegate2;
oDelegate1(); // Invoking Delegate
oDelegate1 -= oDelegate2;
oDelegate1();
}
}

Comments

Popular posts from this blog

ഗുരു ദേവോ ഭവ:

ഇ ന്ന് ദേശീയ അധ്യാപക ദിനം. അധ്യാപകനും രാഷ്ട്രപതിയുമായിരുന്ന ഡോ.എസ് രാധാകൃഷ്ണന്‍റെ പിറന്നാള്‍ ദിനമാണ് അധ്യാപക ദിനമായി നാം ആചരിക്കുന്നത്. ഈ ഒരു സുദിനത്തില്‍ ഈയൊരു അധ്യാപകനെ സ്മരിച്ചില്ലെങ്കില്‍ അതൊരു നന്ദികേടായി പോവും.  ഓര്‍മ്മക്കുറിപ്പിലേക്ക് കടക്കുന്നതിനു മുന്‍പൊരു ഡിസ്ക്ലെയിമര്‍. ബാദ്ധ്യതാ നിരാകരണം ഒടുക്കം മാത്രം നടത്തുന്നതാണ് ആചാരം. എങ്കിലും, അതു താനല്ലയോ ഇതെന്ന് ചുമ്മാ കല്‍പ്പിച്ചു കൂട്ടി എന്തിനുമേതിനും വ്രണപ്പെടുന്നൊരു സമൂഹത്തില്‍, അവകാശപരിത്യാഗം ആദ്യം തന്നെ നടത്തുകയെന്ന ആചാരലംഘനമാവും ഉചിതം. അതെ, ഇനി ഇവിടെ പറയാന്‍ പോവുന്നതൊരു മിത്ത് മാത്രമാണു. എന്ന്? എവിടെ? എത്രത്തോളം? നടന്നുവെന്നതിനൊന്നും ഇവിടെയൊരു പ്രസക്തിയില്ല. പതിറ്റാണ്ടുകളായി കേരളത്തിലെ പലപല കോളേജുകളും ഇതെന്‍റെ ഗര്‍ഭമാണെന്ന അവകാശവാദവുമായി എത്തിയിട്ടുണ്ടു. സത്യം ആര്‍ക്കറിയാം! ഒരു കാര്യം മാത്രം എനിക്കു തറപ്പിച്ചു പറയാം, എന്‍റെ ഗര്‍ഭം ഇങ്ങിനെയല്ല. അതുകൊണ്ടു തന്നെ ഈ കഥയിലെ കഥാപാത്രങ്ങളും കഥാപരിസരവും സാങ്കല്‍പ്പികം മാത്രമാണു, മറിച്ച് തോന്നുന്നെങ്കില്‍ അതു കയ്യിലിരിപ്പിന്‍റെ ഗുണം

മലയാളത്തില്‍ മൊത്തം എത്ര അക്ഷരങ്ങള്‍ ഉണ്ട്?

മലയാളത്തെ മറന്നവര്‍ക്കും മറന്നെന്നു നടിക്കുന്നവര്‍ക്കും ഒന്നോര്‍മ്മ പുതുക്കാന്‍ അക്ഷരമാലയെ രാജേഷ്‌ ഇവിടെ എടുത്തെഴുതുന്നു..... http://chayilyam.com/miscellaneous/personal/%E0%B4%A4%E0%B5%8B%E0%B4%A8%E0%B5%8D%E0%B4%A8%E0%B5%8D%E0%B4%AF%E0%B4%BE%E0%B4%95%E0%B5%8D%E0%B4%B7%E0%B4%B0%E0%B4%99%E0%B5%8D%E0%B4%99%E0%B4%B3%E0%B5%8D%E2%80%8D

കൈപ്പത്തി

പുറത്ത് നിര്‍ത്താതെ നിലവിളിക്കുന്ന ഫയര്‍ അലാറം കേട്ടിട്ട് പേടിയൊന്നും തോന്നിയില്ല. ആവശ്യമുള്ളപ്പോഴൊന്നും  ഒരലാറവും മുന്നറിയിപ്പ് തന്നിട്ടില്ല, ഇതും മോക്ക്‌ ഡ്രില്ലാവാനെ തരമുള്ളൂ. ബോയിലര്‍ റൂമില്‍ കേറി, പ്രശ്നങ്ങളൊന്നുമില്ല എന്നുറപ്പു വരുത്തിയിട്ട് പുറത്തേക്കിറങ്ങി. അസംബ്ലി പോയന്‍റില്‍ ഏതാണ്ടെല്ലാവരും എത്തിയിട്ടുണ്ട്. അരികെയുള്ളോരു  മരച്ചുവട്ടില്‍ കുടയും ചോറ്റുപാത്രവും ഒളിപ്പിച്ച്, ഞാനും ആ കൂട്ടത്തിലേക്ക് ലയിച്ചു.  സുരക്ഷാ ഉദ്യോഗസ്ഥര്‍ക്ക് ആറു മാസം കൂടുമ്പോള്‍ പണിയെടുക്കാന്‍ കിട്ടുന്ന ഏക അവസരമാണ്, അതവര്‍ നന്നായി ആഘോഷിക്കുന്നുമുണ്ട്. കമ്പനിയില്‍ പുതുതായി ചേര്‍ന്നവരെല്ലാം മുന്‍നിരയില്‍ തന്നെ നിലയുറപ്പിച്ചിട്ടുണ്ട്. മീനസൂര്യനോട് കെറുവിച്ച് മനസ്സില്ലാമനസ്സോടെ ഞങ്ങള്‍ കുറച്ച് പേര്‍ ഏറ്റവും പുറകിലും.