在此代码中,EventL
使用 let
绑定(bind),EventM
(试图)使用成员:
type MyType() =
let EventL = new Event<_>()
member this.EventM = new Event<_>()
member this.AddHandlers() =
Event.add (fun string1 -> printfn "EventL: %s" string1) EventL.Publish
Event.add (fun string1 -> printfn "EventM: %s" string1) this.EventM.Publish
member this.Trigger(message) =
EventL.Trigger(message)
this.EventM.Trigger(message)
let myMyType = MyType()
myMyType.AddHandlers()
myMyType.Trigger("Event arg.")
运行时,仅输出 EventL: Event arg.
而 EventM
的处理程序未被调用。
我是不是犯了一个愚蠢的错误,或者遗漏了一些关于成员的逻辑?
最佳答案
您的 EventM
是一个计算属性,每次调用时都会对其进行评估。这会导致在其余代码中创建不同的 Event
对象(2 次,一次在 AddHandlers
中,下一次在 Trigger
中)。
检查 member val
语法。这创建了一个支持领域,并且仍然为公众提供可访问性。
固定版本为:
type MyType() =
member val EventM = new Event<_>()
如果您没有主构造函数,那么您将需要使用 val
并将其分配给您的构造函数:
type MyType =
val EventM : Event<string>
new () = { EventM = new Event<_>() }
请注意,在这种情况下,您必须将类型参数提供给 Event
。
关于events - 是否可以对 F# 事件使用成员而不是 let?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35949863/