2010-09-19 12 views
9

Während auf anonyme Methoden zu lernen, habe ich das folgende Beispiel im Internet gefunden:Verwirrung über anonyme Methoden Parameter

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

Ich verstehe, warum dies funktionieren wird:

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

Aber warum das funktioniert zu:

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

Wenn unser Delegat wird wie folgt erklärt:

public delegate void MyDelegate(string message); 

Akzeptieren von Methoden mit Zeichenfolge als Parameter.

Antwort

14

Es gibt einen Unterschied zwischen

delegate() { ... 

und

delegate { ... 

Die erste ist eine anonyme Methode, die keine Argumente annimmt, während die letztere die Liste ganz Parameter weglässt. In diesem Fall leitet der Compiler die Parameter für Sie ab. Sie können dieses Formular verwenden, wenn Sie die Werte der Parameter nicht benötigen.