Подтвердить что ты не робот

С# - анонимный делегат

Как анонимные методы, делегаты, которых я объявляю с использованием ключевого слова "delegate", являются анонимными делегатами?

namespace Test
{
    public delegate void MyDelegate();
    class Program
    {
        static void Main(string[] args)
        {
            DelegateTest tst = new DelegateTest();
            tst.Chaining();
            Console.ReadKey(true);
        }
    }

    class DelegateTest
    {
        public event MyDelegate del;

        public void Chaining()
        {
            del += delegate { Console.WriteLine("Hello World"); };
            del += delegate { Console.WriteLine("Good Things"); };
            del += delegate { Console.WriteLine("Wonderful World"); };
            del();
        }
    }
}
4b9b3361

Ответ 1

Ваша коллекция делегатов в примере указывает на ряд анонимных методов. Делегат является "просто указателем метода". Не имеет значения, указывает ли он на реальный метод или анонимный метод.

См. http://msdn.microsoft.com/en-us/library/0yw3tz5k(VS.80).aspx

Ответ 2

Нет такой вещи, как "анонимный делегат" (вернее, это не признанный термин в спецификации С# или любая другая спецификация .NET, о которой я знаю).

Существуют анонимные функции, которые включают анонимные методы и лямбда-выражения.

В вашем коде показаны простые старые анонимные методы - хотя они используют одну особенность лямбда-выражений, у которых нет: возможность не выражать параметры вообще, когда вас это не волнует.

Ответ 3

Правильно, вы назначили некоторое количество анонимных методов для события.

Если вы используете более новую версию С#, вы также можете сделать что-то подобное с lambdas. например:

class DelegateTest
{
    public event Action del;

    public void Chaining()
    {
        del += () => Console.WriteLine("Hello World");
        del += () => Console.WriteLine("Good Things");
        del += () => Console.WriteLine("Wonderful World");
        del();
    }
}

Ответ 5

Да. Анонимные делегаты не могут напрямую ссылаться на имя, поэтому использование синтаксиса delegate(){} означает, что они анонимны.

Ответ 6

Ваш делегат не является анонимным. Это называется MyDelegate. Делегат в CLR - это класс, который происходит из System.MulticastDelegate, и в вашем случае он называется MyDelegate. Вы не можете напрямую получать из MulticastDelegate, компилятор С# остановит вас.

В коде, когда вы назначаете делегатам del, тип/имя делегата вызывается компилятором, потому что вы объявили del как событие типа MyDelegate.

Ответ 7

Они являются делегатами анонимных методов. Это один из способов сделать анонимные методы, доступные с .NET 2.0. С .NET 3.0 вы также можете использовать лямбда-выражения, которые проще писать (но компилировать в один и тот же код). Я полагаю, что вы имели в виду "методы анонимной игры". Но на самом деле это одно и то же.