プロパティについて

通常のプロパティと自動実装プロパティ

以下は、Sample クラスの定義で、引数無しコンストラクタと引数ありコンストラクタ、Name, Age 自動実装プロパティ、ToString メソッドのオーバーライドを定義している。

// 自動実装プロパティの場合
type Sample () =

    //do
    //    printfn "called constructor."

    member val Name = "" with get, set
    member val Age = 0 with get, set
    
    new (name:string, age:int) as self = Sample() then
        self.Name <- name
        self.Age <- age

    override self.ToString () =
        "{ Name = " + self.Name + ", Age = " + self.Age.ToString() + " }"

以下は上記と同じことをしているのだが、C# と違って、最初のコンストラクタは引数ありコンストラクタにして、プロパティ数分の引数を受け取ってプライベートフィールドにセットするような書き方になってしまう?

// バッキングフィールドを扱いたい場合のプロパティの場合、メンバー数と同じ数を持つ"引数付きコンストラクタ"を最初に作る
type Sample2 (name: string, age: int) =
    let mutable name = name
    let mutable age = age

    //do
    //    printfn "called constructor with arguments."

    member self.Name
        with get () = name
        and set (v) = name <- v

    member self.Age
        with get () = age
        and set (v) = age <- v

    member self.Age2
        with get () = age
        and set (v) =
            // PropertyChanged とか
            if age <> v then
                age <- v
            

    new () = Sample2("(none)", 20)

    //new () = Sample2("(none)", 20) then
    //    printfn "called constructor."

    override self.ToString () =
        "{ Name = " + self.Name + ", Age = " + self.Age.ToString() + " }"

使う側

[<EntryPoint>]
let main argv =
    
    let debug x = printfn "%A" x
    
    //let obj1 = Sample()
    //let obj2 = Sample2()

    let obj1 = Sample("taro", 25)
    let obj2 = Sample2("hanako", 28)

    debug obj1
    debug obj2




    System.Console.ReadKey() |> ignore
    0