我试图简化代码.如下.
type myClass() =
member this.Member1 = MyCSharpNameSpace.MyClass("param")
let myObj = myClass()
let myVal = myObj.Member1.MyMethod()
Run Code Online (Sandbox Code Playgroud)
MyClass是一个C#类.当我调用成员的方法时,它会被重新初始化.因为我尝试了以下操作来查看是否存在.
type myClass() =
member this.Member1 =
printfn "Reinitializing"
MyCSharpNameSpace.MyClass("param")
Run Code Online (Sandbox Code Playgroud)
为什么这样做?我认为在调用值后调用一个函数,第二次调用它时函数不会被评估.
在F#中,成员值等同于带有getter的C#属性.
即
type MyClass() =
member this.Member1 = MyCSharpNameSpace.MyClass("param")
Run Code Online (Sandbox Code Playgroud)
相当于C#代码:
class MyClass
{
public MyCSharpNameSpace.MyClass Member1
{
get { return new MyCSharpNameSpace.MyClass("param"); }
}
}
Run Code Online (Sandbox Code Playgroud)
希望您现在可以看到,每次调用getter时,都会创建一个新的C#类实例.
如果您希望在构造类时初始化一次然后公开创建的对象,则可以使用其他let绑定来执行此操作,例如
type MyClass() =
let mem1 = MyCSharpNameSpace.MyClass("param")
member this.Member1 = mem1
Run Code Online (Sandbox Code Playgroud)
您也可以使用member val,它会自动创建一个后备存储:
type MyClass() =
member val Member1 = MyCSharpNameSpace.MyClass("param")
Run Code Online (Sandbox Code Playgroud)