2016-06-26 5 views
1

私はコードを単純化しようとしました。それは以下の通りです。なぜ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") 

なぜですか?私は、値を評価した後に関数を呼び出すと考えましたが、関数が評価されていないと呼ばれる2回目です。

答えて

7

F#では、メンバー値はゲッター付きのC#プロパティと同等です。

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

すなわち

は、C#のコードと同等です:

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

がうまくいけば、あなたは今、ゲッターが呼ばれるたびに、あなたのC#クラスの新しいインスタンスをしようとして起こっていることがわかります作成される。

クラスの作成時に一度初期化してから作成したオブジェクトを公開したい場合は、追加のレットバインディングで行うことができます。

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

非常に明確な説明:

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

また、自動的にバッキングストアを作成しmember valを、使用することができます。ありがとうございました。 – ozgur

+0

letバインディングを使用する代わりにメンバーvalを使用すると、同じことになりますか? – ozgur

+1

@ozgur 'member val'は自動的にバッキングストアを作成するので、これも解決策になります。 – TheInnerLight

関連する問題