在此代码中,EventL
使用let
绑定,而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
对象(两次,两次在AddHandlers
中,第二次在Trigger
中)。
签出member val
语法。这创建了一个后备领域,但仍然提供了公共可访问性。
固定版本为:
type MyType() =
member val EventM = new Event<_>()
如果没有主构造函数,则需要使用
val
并将其分配给构造函数:type MyType =
val EventM : Event<string>
new () = { EventM = new Event<_>() }
请注意,在这种情况下,必须将type参数赋予
Event
。