2009-02-15 7 views
6

Ich habe keine Erfahrung in F #, aber ein paar Zeilen Testcode in C# für ein Framework, das ich gemacht habe, dass ich in F # neu schreiben muss.Ereignisse und Delegaten in F #

Jede Hilfe wäre willkommen.

bar.Ready += new Agent.ReadyHandler(bar_Ready);    

    static void bar_Ready(string msg) 
    {  
     Console.WriteLine(msg.body); 
    } 

Antwort

4

Ich habe viel mit diesem gespielt und das ist der Code, der funktioniert.

Ich weiß nicht, wie theoretisch es richtig ist, aber es funktioniert gut.

Kann jemand bestätigen, dass es richtig ist?

+1

Hallo, das ist richtig. Bedauerlicherweise verhält sich F # nicht so gut für alle Delegierten. Ich denke, wenn Ihr Delegierter dem Standard-.NET-Muster folgte (XyzEventHandler nimmt Objekt und XyzEventArgs), dann würden die oben beschriebenen Lösungen auch funktionieren. –

+0

BTW: Wenn Sie der Autor des Delegattyps sind und Sie nur aus F # verwenden möchten, können Sie Funktionen anstelle von Delegaten verwenden. –

+0

@Tomas Petricek: Das Framework selbst, aus dem der Delegat stammt, befindet sich in C#. – Ali

6

Try this -

bar.Ready.AddHandler(new Agent.ReadyHandler (fun sender msg -> System.Console.WriteLine(msg))) 
+0

oder noch kürzer: bar.Ready.AddHandler (Fun Absender msg -> System.Console.WriteLine (msg)) –

+0

Beachten Sie, dass Delegaten in F # nicht die 'BeginInvoke' und 'EndInvoke' Methoden hinzufügen. –

+1

Das gleiche hier bekomme ich: "Das Ereignis 'Bereit' hat einen nicht-Standard-Delegate-Typ und muss mit den expliziten Methoden add_Ready und remove_ready für das Ereignis zugegriffen werden.", Eine Idee warum? – Ali

9

Nur um zu klären - die kürzere Version korrekt sein sollte:

bar.Ready.Add(fun msg -> System.Console.WriteLine(msg)) 

Da F # nicht automatisch Lambda-Funktionen an die Delegierten konvertieren - aber es gibt eine Add-Methode, die eine Funktion übernimmt. Dies kann dann noch einfacher wie folgt geschrieben werden:

bar.Ready.Add(System.Console.WriteLine) 

Da F # ermöglicht Ihnen, .NET-Mitglieder als erstklassige Funktionen zu verwenden.

+1

Ich bekomme den Fehler: Das Ereignis 'Bereit' hat einen nicht-standardmäßigen Delegattyp und muss mit den expliziten Methoden add_Ready und remove_ready für das Ereignis aufgerufen werden. – Ali