Как называется этот тип делегата (C#)

У меня есть эти строки кода.

class Program
{
    public delegate void printer();

    public static void Method()
    {
        Console.WriteLine("Hello");
    }
    static void Main(string[] args)
    {
        printer del = delegate { Method(); };
        del();
        Console.ReadKey();
    }
}

Теперь, что я называю это утверждение printer del = delegate { Method(); };,

Конечно, это нельзя назвать анонимным методом, потому что здесь у меня есть именованный метод.

4 ответа

Решение

Это анонимный делегат, единственная функция которого вызывает именованный метод.

Это называется анонимный метод

Конечно, это нельзя назвать анонимным методом, потому что здесь у меня есть именованный метод

Это все еще анонимный метод, так как @Daniel указал в комментариях, что вы делаете, создавая экземпляр printer делегировать, назначая метод с той же сигнатурой (который оказывается... анонимным методом). Вы можете полностью избежать использования анонимного метода, выполнив:

Printer del = Method;

Это анонимный метод. Внутри метода вызывается именованный метод, но это не меняет того факта, что внешний метод является анонимным.

Вы можете легко увидеть это, когда развернете del:

class Program
{
    public delegate void printer();

    public static void MethodA()
    {
        Console.WriteLine("Hello");
    }

    public static void MethodB()
    {
        Console.WriteLine("World");
    }
    static void Main(string[] args)
    {
        bool x = true;

        printer del = delegate 
        {
            if (x)
            {
                MethodA();
            }
            else
            {
                MethodB();
            }
        };

        del();
        Console.ReadKey();
    }
}

Если вы не хотите использовать делегата, вы можете сделать то же самое с действием:

   Action delA = () => MethodA();
   delA();

Action указывает на метод возврата void, который не принимает параметров.

Это анонимный метод, как сказали другие.

Вы также можете сделать то же самое с этим кодом:

Action del = () => Method();
del();

Таким образом, вам не нужно определять delegate и использовать встроенный Action тип.

Другие вопросы по тегам