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

ഗുരു ദേവോ ഭവ:

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

Crystal reports load report failed: Could not load file or assembly CrystalDecisions.Web, Version=10.2.3600.0

Recently we upgraded our Web Application Server to Windows Server 2008. After this, crystal reports in the VS2005 applications failed to load. This is because VS 2005 applications were using crystal report version 10.2.3600.0 which we can't install in Windows Server 2008. In the new server we can only install the crystal report version 10.5.3700.0. I had to follow the below steps to resolve this issue. Downloaded and installed new version of crystal report from the page below. http://wiki.sdn.sap.com/wiki/pages/viewpage.action?pageId=56787567 Changed versions(10.2.3600.0 to 10.5.3700.0) in Web.Config and report viewer pages We removed all the crystal report reference from the project and tried to refer the new versions. But new versions were not displayed in the list. So I decided to take a local copy of these dlls and refer them. To do this run the below command( as Admin ) regsvr32 -u C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\shfusion.dll The above command will help you

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

I was getting timeout error while executing a stored procedure from the web application. But this stored procedure is executing within a second while running from SQL management studio. This issue can happen when database's statistics and/query plan cache are incorrect. This can be resolved by updating statistics by executing  exec sp_updatestats Error: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. Solution:  exec sp_updatestats If issue didn't resolve even after executing above this, you may need to optimize the query.