C # - анонимный делегат - PullRequest
       16

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

17 голосов
/ 17 ноября 2009

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

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

Ответы [ 7 ]

23 голосов
/ 17 ноября 2009

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

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

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

19 голосов
/ 17 ноября 2009

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

Пожалуйста, смотрите http://msdn.microsoft.com/en-us/library/0yw3tz5k(VS.80).aspx

4 голосов
/ 17 ноября 2009

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

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

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();
    }
}
2 голосов
/ 24 февраля 2011

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

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

2 голосов
/ 17 ноября 2009

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

2 голосов
/ 17 ноября 2009

Да, они являются анонимными делегатами (или, более конкретно, делегатами, вызывающими анонимный метод ).

1 голос
/ 17 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...