2010-12-22 55 views
3

请看下面的例子F#代码:成员属性让 - 或使用 - 在F#中绑定?

type mytype() = 
    member this.v = new OtherClass() 

如果OtherClass实现IDisposable,确实像一个成员约束力的决定让的绑定或使用绑定?有什么办法让它作为一个使用绑定?我有一些代码非常类似于此,我想确保在父对象超出作用域时调用Dispose。

快速扫描通过专家F#未能确定任何东西,但也许我正在寻找书中的错误条款。

回答

6

在您的代码片段中,每次调用成员时(即每次有人使用它时都会创建一个新的OtherClass实例)会员v的主体将被评估。该成员只是返回新创建的对象,你可以像这样使用它:

let m = new MyType() 
use v = m.V // 'use' binding 

我不确定这是不是你问的。如果你想创建只有一个实例,你需要写的东西是这样的:

type MyType() = 
    let v = new OtherClass() 
    member this.V = v 

这种行为照常let结合和v值时的MyType当前实例是不会自动设置处置。有v自动处理,你需要在MyType实现IDisposable明确:

type MyType() = 
    let v = new OtherClass() 
    member this.V = v 
    interface IDisposable with 
    member x.Dispose() = (v :> IDisposable).Dispose() 

不幸的是,没有语法糖这将使它更好的(我曾经建议允许use和含蓄实施IDisposable类型成员F#团队,但他们没有实现它
(但:-)))。

+0

感谢Tomas。这正是我所期待的。再次感谢您为F#问题提供的信息丰富且翔实的答案。 – 2010-12-22 18:22:23