Usos de delegados en C # (u otros idiomas)

Siempre me he preguntado cómo los delegados pueden ser útiles y por qué debemos usarlos. Además de ser seguro para el tipo y todas esas ventajas en la documentación de Visual Studio, ¿cuáles son los usos reales de los delegados?

Ya encontré uno y está muy enfocado.

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]();
         }
    }
}

Pero esto no me muestra exactamente las ventajas de usar delegados en lugar de un condicional "If ... {}" que analiza el argumento y ejecuta el método.

¿Alguien sabe por qué es mejor usar delegado aquí en lugar de "if ... {}". También tiene otros ejemplos que demuestran la utilidad de los delegados.

¡Gracias!

Respuestas a la pregunta(11)

Su respuesta a la pregunta