考虑以下示例F#代码:
type mytype() =
member this.v = new OtherClass()
如果OtherClass实现了IDisposable,那么成员绑定是否像let绑定或use绑定一样?有没有办法让它充当使用绑定?我有一些与此非常相似的代码,我想确保在父对象超出范围时调用Dispose。
通过专家F#进行快速扫描未能找到明确的内容,但也许我正在寻找书中的错误术语。
答案 0 :(得分:6)
在您的代码段中,每次调用成员时都会评估成员v
的正文(意味着每次有人使用它时都会创建OtherClass
的新实例)。该成员只返回新创建的对象,您可以像这样使用它:
let m = new MyType()
use v = m.V // 'use' binding
我不确定这是不是你问的问题。如果您只想创建一个实例,则需要编写如下内容:
type MyType() =
let v = new OtherClass()
member this.V = v
这与let
绑定一样,当v
的当前实例被释放时,MyType
值不会自动处理。要自动处理v
,您需要明确地在IDisposable
中实施MyType
:
type MyType() =
let v = new OtherClass()
member this.V = v
interface IDisposable with
member x.Dispose() = (v :> IDisposable).Dispose()
不幸的是,没有语法糖可以使它更好(我曾经建议允许use
并隐式地为F#团队的类型成员实现IDisposable
,但他们没有实现它
(还: - )。))