是否可以使用成员而不是让F#事件?

Lar*_*ien 3 events f# observable

在此代码中,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.")
Run Code Online (Sandbox Code Playgroud)

运行时,仅EventL: Event arg.EventM未调用处理程序时输出.

我犯了一个愚蠢的错误或遗漏了一些关于成员的逻辑吗?

Fra*_*ger 7

EventM是一个计算属性,每次调用时都会对其进行评估.这导致在Event代码的其余部分中创建不同的对象(2次,一次进入AddHandlers,下一次进入Trigger).

检查member val语法.这创建了一个支持领域,仍然提供公共可访问性.

固定版本将是:

type MyType() =
    member val EventM = new Event<_>()
Run Code Online (Sandbox Code Playgroud)

如果您没有主构造函数,那么您将需要使用val而不是在构造函数中指定它:

type MyType =
    val EventM : Event<string>
    new () = { EventM = new Event<_>() }
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,您必须提供type参数Event.