成员属性在F#中是Let-Bound还是Use-Bound?
考虑以下示例F#代码: 如果OtherClass实现IDisposable,那么成员绑定的行为类似于let绑定还是use绑定?有没有办法让它充当一个使用绑定?我有一些类似的代码,我想确保在父对象超出范围时调用Dispose成员属性在F#中是Let-Bound还是Use-Bound?,f#,F#,考虑以下示例F#代码: 如果OtherClass实现IDisposable,那么成员绑定的行为类似于let绑定还是use绑定?有没有办法让它充当一个使用绑定?我有一些类似的代码,我想确保在父对象超出范围时调用Dispose 快速浏览Expert F#没有找到任何明确的内容,但可能我在书中查找了错误的术语。在您的代码片段中,每次调用成员时都会对成员的主体v进行评估(这意味着每次有人使用它时,它都会创建OtherClass的新实例)。成员只返回新创建的对象,您可以这样使用它: let m = new
快速浏览Expert F#没有找到任何明确的内容,但可能我在书中查找了错误的术语。在您的代码片段中,每次调用成员时都会对成员的主体
v
进行评估(这意味着每次有人使用它时,它都会创建OtherClass
的新实例)。成员只返回新创建的对象,您可以这样使用它:
let m = new MyType()
use v = m.V // 'use' binding
type MyType() =
let v = new OtherClass()
member this.V = v
我不确定这是否是你问的问题。如果只想创建一个实例,则需要编写如下内容:
let m = new MyType()
use v = m.V // 'use' binding
type MyType() =
let v = new OtherClass()
member this.V = v
这与通常的let
绑定一样,当处置MyType
的当前实例时,v
值不会自动处置。要自动处理v
,您需要在MyType
中明确实现IDisposable
:
type MyType() =
let v = new OtherClass()
member this.V = v
interface IDisposable with
member x.Dispose() = (v :> IDisposable).Dispose()
不幸的是,没有语法上的甜点可以让它更好(我曾经建议允许use
并隐式地为F#团队的类型成员实现IDisposable
,但他们没有实现它(然而:-)谢谢托马斯。这正是我想要的。再次感谢您对一个F#问题提供了信息丰富的答案。