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

ozg*_*gur 1 f#

我试图简化代码.如下.

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)

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

The*_*ght 7

在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)