In C#, a delegate is a pointer to a method. That means, a delegate holds the address of a method which can be called using that delegate.
Let's learn how we can define and execute a delegate.
Define a delegate
We define a delegate just like we define a normal method. That is, delegate also has a return type and parameter. For example, 
public delegate int myDelegate(int x);
Here,
delegate- a keywordint- return type of delegatemyDelegate- delegate nameint x- parameter that the delegate takes
Any method from any accessible class or struct that matches the delegate signature can be assigned to the delegate.
Note: A delegate is also called type-safe pointer.
Instantiate a delegate
Suppose, we have a method named calculateSum() whose signature is the same as myDelegate. 
To create an instance of myDelegate, we pass a method name as a parameter. For example,
myDelegate d1 = new myDelegate(calculateSum);
Example: Calling a Method Using delegate
using System;
using System.Collections.Generic;
class Program
{
    // define a method that returns sum of two int numbers 
    static int calculateSum(int x, int y)
    {
        return x + y;
    }
    // define a delegate
    public delegate int myDelegate(int num1, int num2);
    static void Main()
    {
        // create an instance of delegate by passing method name 
        myDelegate d = new myDelegate(calculateSum);
        // calling calculateSum() using delegate
        int result = d(5, 6);
        Console.WriteLine(result);
    }
}
Output
11
In the above example, we have created an instance of myDelegate  d) and passed calculateSum() as a parameter. 
Here, we have called the calculateSum() method by passing 5 and 6 as parameters values in d. 
Use of C# delegates
We can use delegates to:
- promote reusability of code and implement flexibility
 - notify which method to call when an event is triggered
 - define callback methods
 
Frequently Asked Questions
The multicast delegate is used to point to more than one method at a time. We use += operator to add methods to delegate. For example,
using System;
class Program
{
    // method that prints sum of two int numbers 
    public void sum(int x, int y)
    {
        Console.WriteLine("Sum is: " + (x + y));
    }
    // method that prints difference of two int numbers 
    public void difference(int x, int y)
    {
        Console.WriteLine("Difference is: " + (x - y));
    }
    // define a delegate of int type 
    public delegate void myDelegate(int num1, int num2);
    static void Main()
    {
        // instance of Program class
        Program obj = new Program();
        // create an instance of delegate and
        // pass sum method as a parameter 
        myDelegate d = new myDelegate(obj.sum);
        // multicast delegate 
        // calls difference() method 
        d += obj.difference;
        // pass values to two methods i.e sum() and difference()
        d(6, 5);
    }
}
Output
Sum is: 11 Difference is: 1