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

Ono*_*cci 3 f#

考虑以下示例F#代码:

type mytype() =
   member this.v = new OtherClass()
Run Code Online (Sandbox Code Playgroud)

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

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

Tom*_*cek 6

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

let m = new MyType()
use v = m.V // 'use' binding
Run Code Online (Sandbox Code Playgroud)

我不确定这是不是你问的问题.如果您只想创建一个实例,则需要编写如下内容:

type MyType() =
  let v = new OtherClass() 
  member this.V = v
Run Code Online (Sandbox Code Playgroud)

这与通常的let绑定相同,并且在v处理当前实例时不会自动处理该值MyType.已经v自动配置,你需要实现IDisposableMyType明确:

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

不幸的是,没有语法糖可以使它更好(我曾经建议允许use并隐式实现IDisposable类型成员到F#团队,但他们没有实现它
(还是:-))).