我试图简化代码。如下。
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")
为什么这样做?我认为在调用值后调用一个函数,第二次调用它时函数不会被评估。
答案 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")