成员属性是否允许或使用F#?

时间:2010-12-22 18:02:41

标签: f#

考虑以下示例F#代码:

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

如果OtherClass实现了IDisposable,那么成员绑定是否像let绑定或use绑定一样?有没有办法让它充当使用绑定?我有一些与此非常相似的代码,我想确保在父对象超出范围时调用Dispose。

通过专家F#进行快速扫描未能找到明确的内容,但也许我正在寻找书中的错误术语。

1 个答案:

答案 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,但他们没有实现它
 (还: - )。))