2010-09-19 2 views
9

В процессе обучения на анонимные методы, я нашел следующий пример в Интернете:Путаница анонимных методов параметры

namespace AnonymousMethods 
{ 
    public class MyClass 
    { 
     public delegate void MyDelegate(string message); //delegate accepting method with string parameter 
     public event MyDelegate MyEvent; 
     public void RaiseMyEvent(string msg) 
     { 
      if (MyEvent != null) MyEvent(msg); 
     } 
    } 
    class Caller 
    { 
     static void Main(string[] args) 
     { 
      MyClass myClass1 = new MyClass(); 

// here the confusion 
      myClass1.MyEvent += delegate 
      { 
       Console.WriteLine("we don't make use of your message in the first handler"); 
      }; 

      myClass1.MyEvent += delegate(string message) 
      { 
       Console.WriteLine("your message is: {0}", message); 
      }; 

      Console.WriteLine("Enter Your Message"); 
      string msg = Console.ReadLine(); 
      myClass1.RaiseMyEvent(msg); 
      Console.ReadLine(); 
     } 
    } 
} 

Я понимаю, почему это будет работать:

myClass1.MyEvent += delegate(string message){ 
    Console.WriteLine("your message is: {0}", message); } 

Но почему это работает тоже:

myClass1.MyEvent += delegate { 
    Console.WriteLine("we don't make use of your message in the first handler"); } 

Когда наш делегат объявляется следующим образом:

public delegate void MyDelegate(string message); 

Принятие методов со строкой в ​​качестве параметра.

ответ

14

Существует разница между

delegate() { ... 

и

delegate { ... 

Первый анонимный метод, который не принимает никаких аргументов, в то время как последний опускает список параметров в целом. В этом случае компилятор отображает параметры для вас. Вы можете использовать эту форму, если вам действительно не нужны значения параметров.

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