F#中的基本一次性模式

问题描述 投票:0回答:0

根据 https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/dispose-pattern#basic-dispose-pattern

Basic Disposable Pattern 需要在 Disposable 类中定义一个 protected virtual void Dispose(bool) 方法。

但是,F# 没有 protected 修饰符,所以我能想到的最接近的实现是 public。

type DisposableType () = 
    abstract member Dispose: bool -> unit

    default __.Dispose(disposing: bool) = 
        if disposing then ...

    interface IDisposable with
        member this.Dispose() = 
            this.Dispose(true)
            GC.SuppressFinalize(this)

这是该模式的有效实现吗? 我想知道 .NET 是否使用反射来发现虚拟 Dispose 方法并明确查找 protected 方法。在这种情况下,似乎没有办法在 F# 中实现模式。

编辑

阅读 Brian Berns 后的更多背景信息链接

type DisposableType (observable: IObservable<unit>) = 
    let mutable subscription = observable.Subscribe(id)

    interface IDisposable with
        member __.Dispose() = 
            if not <| isNull subscription then 
                subscription.Dispose()
                subscription <- null

Dispose 模式用于非托管资源

字段订阅是一个 IDisposable,但是它是一个方便的对象,可以删除委托处理程序(在处置时)。据我所知,这与非托管资源无关。

GC知道如何处理托管资源

在这种情况下,不,它没有。如果我们不显式调用 subscription.Dispose(),就会造成泄漏,即使不涉及本机资源或 SafeHandle。

我们不应该创建 Finalizable 对象

如果代码忘记处理 DisposableType 实例会发生什么? AFAIK,我们有一个泄漏问题,我认为解决它的唯一方法是提供一个终结器(迟到总比不到好)。

99%的案例终结者是不需要的

如果仅在 1% 的情况下使用可观察量,我会感到惊讶。

我错过了什么吗?

f# idisposable
© www.soinside.com 2019 - 2024. All rights reserved.