web-dev-qa-db-ja.com

オブジェクト初期化構文

私はF#から始めたばかりで、C#3のようにオブジェクトの初期化を行う構文が見つかりません。

つまりこれを与えられた:

public class Person {
  public DateTime BirthDate { get; set; }
  public string Name { get; set; }
}

f#で次のように記述する方法:

var p = new Person { Name = "John", BirthDate = DateTime.Now };
97

あなたはこのようにそれを行うことができます:

let p = new Person (Name = "John", BirthDate = DateTime.Now)
135
CMS

cMSからの答えは間違いなく正しいです。ここにも役立つかもしれない追加が1つだけあります。 F#では、不変のプロパティだけを使用して型を記述したい場合がよくあります。 「オブジェクト初期化子」構文を使用する場合、プロパティは変更可能でなければなりません。 F#の代替方法は、名前付き引数を使用することです。これにより、同様の構文が得られますが、不変の状態が維持されます。

type Person(name:string, ?birthDate) =
  member x.Name = name
  member x.BirthDate = defaultArg birthDate System.DateTime.MinValue

今、私たちは書くことができます:

let p1 = new Person(name="John", birthDate=DateTime.Now)
let p2 = new Person(name="John")

コードでは名前を指定する必要がありますが、生年月日はオプションの引数であり、デフォルト値がいくつかあります。

96
Tomas Petricek

newキーワードを省略して、冗長な構文を使用することもできます。

let p = Person(BirthDate = DateTime.Now, Name = "John")

https://docs.Microsoft.com/en-us/dotnet/fsharp/language-reference/members/constructors

2