Hi!

Today's C# topic, Delegates, is very interesting. Some say, it’s very complex. I hope you have worked on delegate and know about it. However, for freshers, it is a very complex topic. So, I am going to explain it in a simple way. I hope, after that, you will get the basic idea of delegate and love to use delegates in your project.

What is Delegate?

If you have got a chance to work with C++, then you definitely know about function pointer in C++.

Delegate is just like the function pointer in C#, but delegates are type safe. Delegate is an object that points to another method either static or instance. It takes arguments and returns value. It takes reference to other methods. We can invoke or call the method through the delegate object.

Points to remember regarding Delegate
  1. Using Delegates, we can pass methods and parameters.
  2. Using Delegates, we can define callback methods.
  3. We can call multiple methods on a single call using Delegate.

To use Delegate, there are only four steps -

  1. Declare a delegate type.
  2. Create or find a method which has same type of delegate.
  3. Create object/instance of Delegate.
  4. And at last, Invoke Delegate object.

Declare a Delegate type

First step to start with delegate is to declare the delegate type. The “delegate” keyword is used to define a delegate type.

  1. //Declare a Delegate
  2. delegate int DotnetTutorialDelegate(int x, int y, int z);
  3. //Declare a Generic Delegate
  4. public delegate T Add<T>(T x, T y, T z);
Create or Find a method which has same signature as Delegate

To use delegate, you have methods or to create methods which have same signature of delegate. We can use instance and static methods with delegate.

Create instance of Delegate
  1. //For simple delegate
  2. DotnetTutorialDelegate objDelegate1 = new DotnetTutorialDelegate(DelegateExample.Average);
  3. //For Generic type delegate
  4. Add<double> objDoubleTypeDelegate = GenericDelegateExample.AddDouble;
Invoke Delegate object
  1. //First Way to call delegate
  2. Console.WriteLine("value is " + objDelegate1.Invoke(3, 8, 9));
  3. //Second Way to call delegate
  4. Console.WriteLine("value is " + objDelegate1(3, 4, 5));
Full Example of Simple Delegate
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace NextWithDeleage
  6. {
  7. //Declare a Delegate
  8. delegate int DotnetTutorialDelegate(int x, int y, int z);
  9. public class DelegateExample
  10. {
  11. //instance method
  12. public int Add(int a, int b, int c)
  13. {
  14. return (a + b + c);
  15. }
  16. //static method
  17. public static int Average(int a, int b, int c)
  18. {
  19. return (a + b + c) / 3;
  20. }
  21. }
  22. class Program
  23. {
  24. static void Main(string[] args)
  25. {
  26. //instance of delegate
  27. DotnetTutorialDelegate objDotnetTutorialDelegate;
  28. DelegateExample clsDelegateExample = new DelegateExample();
  29. //reference of instance method to delegate instance
  30. objDotnetTutorialDelegate = clsDelegateExample.Add;
  31. //First Way to call delegate
  32. Console.WriteLine("value is " + objDotnetTutorialDelegate(3, 3, 2));
  33. //reference of static method to delegate instance
  34. DotnetTutorialDelegate objDelegate1 = new DotnetTutorialDelegate(DelegateExample.Average);
  35. //Second Way to call delegate
  36. Console.WriteLine("value is " + objDelegate1.Invoke(3, 8, 9));
  37. //Third Way to call delegate
  38. Console.WriteLine("value is " + objDelegate1(3, 4, 5));
  39. Console.ReadLine();
  40. }
  41. }
  42. }
Full Example of Generic Delegate
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace NextWithDeleage
  6. {
  7. //Declare a generic delegate
  8. public delegate T Add<T>(T x, T y, T z);
  9. public static class GenericDelegateExample
  10. {
  11. public static int AddInt(int x, int y, int z)
  12. {
  13. return (x + y + z);
  14. }
  15. public static double AddDouble(double x, double y, double z)
  16. {
  17. return (x+y+z);
  18. }
  19. }
  20. class Program
  21. {
  22. static void Main(string[] args)
  23. {
  24. Add<int> objIntTypeDelegate = new Add<int>(GenericDelegateExample.AddInt);
  25. //A new way to reference method to delegate instace
  26. Add<double> objDoubleTypeDelegate = GenericDelegateExample.AddDouble;
  27. Console.WriteLine("Sum of 2, 3 and 4 is " + objIntTypeDelegate(2, 3, 4));
  28. Console.WriteLine("Sum of 2.3, 3.4 and 4.5 is " + objDoubleTypeDelegate(2.3, 3.4, 4.5));
  29. Console.ReadLine();
  30. }
  31. }
  32. }
Conclusion

Today, we learned about Delegates in C# and what is the use of it. We also learned how to create simple delegate and how to create a generic delegate. Hope you enjoyed.

Reference

If you want to know more, please click here.

I hope this post helps you. Please put your feedback using comment which will help me improve for the next post. If you have any doubts, please ask your doubts or query in the comment section.