プロパティについて
通常のプロパティと自動実装プロパティ
以下は、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