2

「自動的に実装されたプロパティは型の初期化の一部であるため、型定義で let バインディングや do バインディングと同様に、他のメンバー定義の前に含める必要があります」

しかし、型宣言でmember val他の通常のプロパティを追加しても、コンパイラは文句を言いません。member this.問題無いですか?

プロパティが最初に呼び出されたときではなく、オブジェクトを初期化するときにプロパティが初期化されると言うのは正しいですか?

例えば

   member val = let printf "%A" "initializing"
                3 with get, set

したがって、オブジェクトを作成するたびに、「初期化していますか?

4

1 に答える 1

4

はい、自動的に実装される の初期化コードmemberは、オブジェクト構築の一部として実行されます ( のmember x.Bar = ...前に他の宣言を置いたとしてもmember val):

type Test() =
  do printfn "constructor"
  member x.Bar = 
    printfn "calling Bar"
    10
  member val Foo = 
    printfn "initializing Foo" 
    3 with get, set

let t = Test()
printfn "constructed"
t.Foo

コンストラクターのコードが最初に実行され、その後にFoo初期化が続きます (一方、 のコードはBar、実際に を呼び出すまで呼び出されませんt.Bar)。したがって、次のように出力されます。

構築された
Foo を初期化する
コンストラクタ

于 2012-11-16T11:06:03.187 に答える