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% 的情况下使用可观察量,我会感到惊讶。
我错过了什么吗?