A utilização de delegates é útil por conter a habilidade para personalizar comportamentos de objeto durante o uso e execução dos programas. Na maioria das vezes, você pode usar outras maneiras, mas a utilização de delegates pode ser apenas a maneira mais fácil em algumas situações para obter a “coisa feita”.
O exemplo abaixo é um tipo de delegate que contém a referência de método (s) em um objeto. É também referido como um ponteiro de tipo seguro ou “safe pointer type”.
class Program
{
public delegate int DelegateHandler(int a, int b);
static void Main(string[] args)
{
Resultados resultados = new Resultados();
DelegateHandler dlgt = new DelegateHandler(resultados.Soma);
Console.WriteLine("Resultado de soma é: " + dlgt(30, 10));
dlgt = new DelegateHandler(resultados.Subtrai);
Console.WriteLine("Resultado de subtração é: " + dlgt(30, 10));
dlgt = new DelegateHandler(resultados.Multiplica);
Console.WriteLine("Resultado de multiplicação é: " + dlgt(30, 10));
dlgt = new DelegateHandler(resultados.Divide);
Console.WriteLine("Resultado de divisão é: " + dlgt(30, 10));
Console.ReadLine();
}
}
public class Resultados
{
public int Soma(int a, int b)
{
return a + b;
}
public int Subtrai(int a, int b)
{
return a - b;
}
public int Multiplica(int a, int b)
{
return a * b;
}
public int Divide(int a, int b)
{
return a / b;
}
}

As saídas serão os resultados de cada operação matemática, de uma forma bem simples. Você também pode customizar o delegate para exibir string, objetos e o que mais precisar!
Um grande abraço.
