Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
成员属性在F#中是Let-Bound还是Use-Bound?_F# - Fatal编程技术网

成员属性在F#中是Let-Bound还是Use-Bound?

成员属性在F#中是Let-Bound还是Use-Bound?,f#,F#,考虑以下示例F#代码: 如果OtherClass实现IDisposable,那么成员绑定的行为类似于let绑定还是use绑定?有没有办法让它充当一个使用绑定?我有一些类似的代码,我想确保在父对象超出范围时调用Dispose 快速浏览Expert F#没有找到任何明确的内容,但可能我在书中查找了错误的术语。在您的代码片段中,每次调用成员时都会对成员的主体v进行评估(这意味着每次有人使用它时,它都会创建OtherClass的新实例)。成员只返回新创建的对象,您可以这样使用它: let m = new

考虑以下示例F#代码:

如果OtherClass实现IDisposable,那么成员绑定的行为类似于let绑定还是use绑定?有没有办法让它充当一个使用绑定?我有一些类似的代码,我想确保在父对象超出范围时调用Dispose


快速浏览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#问题提供了信息丰富的答案。