Usos de delegados em c # (ou outros idiomas)

Eu sempre me perguntei como os delegados podem ser úteis e por que devemos usá-los? Outros, em seguida, sendo tipo seguro e todas as vantagens na documentação do Visual Studio, quais são os usos do mundo real dos delegados.

Eu já encontrei um e é muito segmentado.

using System;

namespace HelloNamespace {

    class Greetings{
    public static void DisplayEnglish() {
            Console.WriteLine("Hello, world!");
    }
    public static void DisplayItalian() {
             Console.WriteLine("Ciao, mondo!");
    }
    public static void DisplaySpanish() {
             Console.WriteLine("Hola, imundo!");
         }
    }

    delegate void delGreeting();

    class HelloWorld {
        static void Main(string [] args) {

    int iChoice=int.Parse(args[0]);
    delGreeting [] arrayofGreetings={
             new delGreeting(Greetings.DisplayEnglish),
             new delGreeting(Greetings.DisplayItalian),
             new delGreeting(Greetings.DisplaySpanish)};

    arrayofGreetings[iChoice-1]();
         }
    }
}

Mas isso não me mostra exatamente as vantagens de usar delegados ao invés de um condicional "If ... {}" que analisa o argumento e executa o método.

Alguém sabe por que é melhor usar o delegado aqui em vez de "se ... {}". Além disso, você tem outros exemplos que demonstram a utilidade dos delegados.

Obrigado!

questionAnswers(11)

yourAnswerToTheQuestion