Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将此c代码移植到f以处理SFML事件_C#_F#_Sfml - Fatal编程技术网

C# 如何将此c代码移植到f以处理SFML事件

C# 如何将此c代码移植到f以处理SFML事件,c#,f#,sfml,C#,F#,Sfml,我正在尝试用F创建一个SFML应用程序,因为没有F教程,所以我正在尝试从c教程中学习。我根本不懂c,只懂f的基本知识 我在C语言中遇到了这段代码,我不确定等价的F代码是什么 static void Main() { ... window.KeyPressed += new EventHandler<KeyEventArgs>(OnKeyPressed); ... }

我正在尝试用F创建一个SFML应用程序,因为没有F教程,所以我正在尝试从c教程中学习。我根本不懂c,只懂f的基本知识

我在C语言中遇到了这段代码,我不确定等价的F代码是什么

   static void Main()
        {
            ...

            window.KeyPressed += new EventHandler<KeyEventArgs>(OnKeyPressed);

            ...

        }

        static void OnKeyPressed(object sender, KeyEventArgs e)
        {
            Window window = (Window)sender;
            if (e.Code == Keyboard.Key.Escape)
                window.Close();
        }
F将事件转换为IEEvent,该事件公开AddHandler方法以及IObservable.Subscribe方法

您可以使用AddHandler添加委托,相当于C中的+=委托

如果要进行事件处理,最好将事件视为可观察事件

window.KeyPress |> Observable.op... |> Observable.subscribe(fun evt -> printfn "Pressed %A" evt.Code)
还有一个事件模块,可以让您编写事件。您当前的示例可以改写为:

window.KeyPress 
|> Event.filter(fun evt -> evt.Code = Keyboard.Key.Escape) 
|> Event.add (fun _ -> window.Close())

这三种方法中的任何一种都有主要的优点/缺点吗?或者这只是一个偏好的问题?如果您想简化删除处理程序的过程,请选择subscribe,因为它为您提供了删除处理程序的一次性方法。Event.add更适合于类型推断。除此之外,个人偏好。
window.KeyPress 
|> Event.filter(fun evt -> evt.Code = Keyboard.Key.Escape) 
|> Event.add (fun _ -> window.Close())