gpt4 book ai didi

f# - 如何检查 F# 中是否正在处理事件

转载 作者:行者123 更新时间:2023-12-02 19:41:14 27 4
gpt4 key购买 nike

以下 C# 代码的 F# 等效项是什么?具体来说,我需要检查是否正在处理事件。

protected virtual void OnClicked(ClickEventArgs e) {
if (this.Clicked != null) //how can I perform this check in F#
this.Clicked(this, e);
}

最佳答案

实现RequiresSubscriptionEvent的替代方法是建立在现有的Event之上功能(使用组合),只需添加一个计数器来计算注册处理程序的数量并添加一个属性 HasListeners (如果您愿意,甚至可以发布听众的数量...)

这使得代码更容易使用,并且希望也更安全,因为如果您不检查它是否有任何 listneres,它仍然会像通常的 F# 代码一样工作。如果您想执行检查,您可以...

type RequiresSubscriptionEvent<_>() = 
let evt = new Event<_>()
let mutable counter = 0
let published =
{ new IEvent<_> with
member x.AddHandler(h) =
evt.Publish.AddHandler(h)
counter <- counter + 1;
member x.RemoveHandler(h) =
evt.Publish.RemoveHandler(h)
counter <- counter - 1;
member x.Subscribe(s) =
let h = new Handler<_>(fun _ -> s.OnNext)
x.AddHandler(h)
{ new System.IDisposable with
member y.Dispose() = x.RemoveHandler(h) } }
member x.Trigger(v) = evt.Trigger(v)
member x.Publish = published
member x.HasListeners = counter > 0

使用示例:

type Demo() =
let evt = new RequiresSubscriptionEvent<_>()
[<CLIEvent>]
member x.OnSomething = evt.Publish
member x.FooThatFiresSomething() =
if evt.HasListeners then
evt.Trigger("foo!")
else
printfn "No handlers!"

尽管这不是标准 F# 库的一部分,但它显示了 F# 一流事件的巨大优势。如果有一些功能缺失,您可以简单地自己实现!

关于f# - 如何检查 F# 中是否正在处理事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2111045/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com