2009-11-17 3 views
16

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

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

ответ

19

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

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

2

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

1

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

+0

Лямбда-выражения и анонимные методы в синтаксисе лямбда не совсем то же самое. Ваше утверждение верно, если вы используете синтаксис лямбда с фигурными фигурными скобками: (x) => {y();} – Lucero

4

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

Если вы используете более новую версию C#, вы также можете сделать что-то подобное с 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(); 
    } 
} 
+2

Вы имеете в виду C# 3.0? – user160677

23

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

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

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

+0

Умм. вы можете пояснить это. Обычно мы видим, что термин «Анонимные делегаты» используется везде, где также используется термин «Анонимные методы», используемый в MSDN, поэтому мы ошибаемся, говоря, что предыдущие или оба являются правильными. –

+0

@Shekhar_Pro: «Анонимный методы ". «Анонимные делегаты» неверны. Вы говорите, что вы «обычно видите [это] где угодно» - не могли бы вы привести конкретные места? –

+0

Не в каком-либо официальном документе, а в обычной терминологии, используемой Netizens. Как ... SO сама .. http://stackoverflow.com/search?q=anonymous+delegate .... так похоже, что мы привыкли использовать неправильный термин. –

2

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

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

Смежные вопросы