为什么每次调用F#类成员时都会初始化它?

时间:2016-06-26 19:55:36

标签: f#

我试图简化代码。如下。

type myClass() = 
    member this.Member1 = MyCSharpNameSpace.MyClass("param")

let myObj = myClass()
let myVal = myObj.Member1.MyMethod()

MyClass是一个C#类。当我调用成员的方法时,它会被重新初始化。因为我尝试了以下操作来查看它是否存在。

type myClass() = 
        member this.Member1 = 
                      printfn "Reinitializing"
                      MyCSharpNameSpace.MyClass("param")

为什么这样做?我认为在调用值后调用一个函数,第二次调用它时函数不会被评估。

1 个答案:

答案 0 :(得分:7)

在F#中,成员值等同于带有getter的C#属性。

type MyClass() = 
    member this.Member1 = MyCSharpNameSpace.MyClass("param")

等同于C#代码:

class MyClass
{
   public MyCSharpNameSpace.MyClass Member1 
   { 
       get { return new MyCSharpNameSpace.MyClass("param"); }
   }
}

希望您现在可以看到,每次调用getter时,都会创建一个新的C#类实例。

如果您希望在构造类时初始化一次然后公开创建的对象,则可以使用额外的let绑定来执行此操作,例如

type MyClass() = 
    let mem1 = MyCSharpNameSpace.MyClass("param")
    member this.Member1 = mem1

您还可以使用member val,这将自动创建后备存储:

type MyClass() = 
    member val Member1 = MyCSharpNameSpace.MyClass("param")