Delegates In C#

Delegates in C#


Delegates can be used to hold the reference of method. A delegate is a type that safety encapsulates a method and it is similar to function pointer in C and C++. Delegates can be used to define call back methods. Delegate class hold only those methods which have same signature. It allow methods to be passed as parameters. A delegate can be seen as a placeholder for method. Delegates can be chained multiple methods together and can be called on a single event.

Suppose if you have multiple methods with same signature which have same return type & number of parameters and want to call all the methods with single object then we can go for delegates.

Creating and using delegates involve the four steps:

  • 1. Declaring a delegate
  • 2. Defining a delegate method
  • 3. Creating delegate object
  • 4. Invoking delegate object
class Program
{
    // Step-1. Declaring a delegates
    // Access modifier - delegate keyword - return type - delegate-name
    public delegate void Calculate(int a, int b); 

    // Step-2. Defining a delegate method
    // Signature of method exactly matches the delegate signature.
    public static void Add(int x, int y)
    {
        Console.WriteLine("Sum = {0}", x + y);
    } 

    static void Main(string [] args)
    {
        // Step-3. Creating delegate object
        Calculate calculate = new Calculate(Add);

        // Step-4. Invoking delegate object
        calculate(5, 5);

        Console.ReadKey();
    }      
}

You can also assign any method to delegates like :

// Step-3. Creating delegate object
Calculate calculate = Add;

Types of Delegates


1. Single cast delegate

Delegate that represent only a single method is known as Single Cast Delegate.

class Program
{
    //  Declaring a delegates      
    public delegate void Calculate(int a, int b); 

    // Defining a delegate method     
    public static void Add(int x, int y)
    {
        Console.WriteLine("Sum = {0}", x + y);
    } 

    static void Main(string [] args)
    {
        // Creating delegate object
        Calculate calculate = new Calculate(Add);

        // Invoking delegate object
        calculate(5, 5);
        Console.ReadKey();
    }      
}

2. Multi Cast Delegate

Delegate that represent more than one method is known as Multi Cast Delegate.

Use += operator to add reference of a method to delegate

Use -= operator to remove reference of a method

class Program
{
    // Declaring a delegates     
    public delegate void Calculate(int a, int b);

    // Defining a delegate method     
    public static void Add(int x, int y)
    {
        Console.WriteLine("Sum = {0}", x + y);
    } 

    // Defining second delegate method
    public static void Multiply(int x, int y)
    {
        Console.WriteLine("Multiply = {0}", x + y);
    }  

    static void Main(string [] args)
    {
        // Creating delegate object
        Calculate calculate = new Calculate(Add);

        // Add second method to delegate
        calculate += Multiply; 

        // Invoking delegate object, it will call Add and Multiply both method
        calculate(5, 5);

        Console.ReadKey();
    }
}

You can also create separate delegate object for each method and combine all objects to a single to perform Multicast delegate.

// Alternate way of creating Multicast delegate object
Calculate delegate1 = Add;
Calculate delegate2 = Multiply;
Calculate calculate = delegate1 + delegate2;

Remove reference of a method from Multicast delegate object.

static void Main(string [] args)
{
    //Creating delegate object
    Calculate calculate = new Calculate(Add);

    // add second method to delegate
    calculate += Multiply;

    // Remove reference of Add method to delegate
    calculate -= Add;

    // Invoking delegate object, it will call only Multiply method
    calculate(5, 5);

    Console.ReadKey();
} 

// Output
// Multiply = 10