С# - анонимный делегат
Как анонимные методы, делегаты, которых я объявляю с использованием ключевого слова "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();
}
}
}
Ответы
Ответ 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();
}
}
Ответ 4
Да, это анонимные делегаты (или, более конкретно, делегаты, вызывающие анонимный метод).
Ответ 5
Да. Анонимные делегаты не могут напрямую ссылаться на имя, поэтому использование синтаксиса delegate(){}
означает, что они анонимны.
Ответ 6
Ваш делегат не является анонимным. Это называется MyDelegate.
Делегат в CLR - это класс, который происходит из System.MulticastDelegate, и в вашем случае он называется MyDelegate.
Вы не можете напрямую получать из MulticastDelegate, компилятор С# остановит вас.
В коде, когда вы назначаете делегатам del, тип/имя делегата вызывается компилятором, потому что вы объявили del как событие типа MyDelegate.
Ответ 7
Они являются делегатами анонимных методов. Это один из способов сделать анонимные методы, доступные с .NET 2.0. С .NET 3.0 вы также можете использовать лямбда-выражения, которые проще писать (но компилировать в один и тот же код). Я полагаю, что вы имели в виду "методы анонимной игры". Но на самом деле это одно и то же.