2016-12-30 15 views
6

I F#でknow thatあなたはフォーマットのC#クラスがある場合:しかし、どのようにF#のオブジェクトの初期化

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

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

あなたはそうのようにそれを初期化することができ、素敵ですC#クラスにもこのようなコンストラクタがある場合、F#で初期化しますか?

public class Person { 
    public Person(int id) 
    { 
     Id = id 
    } 

    public int Id {get; private set;} 
    public DateTime BirthDate { get; set; } 
    public string Name { get; set; } 
} 

代わりに構造ですか?

let p = new Person (123) 
p.Name <- "John" 
p.BirthDate <- DateTime.Now 
+0

[オブジェクト初期化構文](http://stackoverflow.com/questions/371878/object-initialization-syntax) –

+0

@AntonSchwaighoferカバーの可能性のある重複同様のトピックですが、参照された質問にはないコンストラクタを追加する方法を尋ねます。 –

答えて

7

次のようになります。自動プロパティのequivilent F#構文を使用しました。あなたは次のようにコンストラクタとプロパティの初期化を結合することができます:

type Person(id : int) = 
    member val Id = id with get,set 
    member val BirthDate = DateTime.MinValue with get,set 
    member val Name = "" with get,set 

let p = Person(5, Name = "Stu") 
p |> Dump 
+0

これは、コンストラクタとメンバプロパティの初期化を区別するプロパティ名の明示的な宣言なのですか? –

+2

はい、[こちら](https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/members/constructors#assigning-values-to-properties-at-initialization)をご覧くださいオプションのコンストラクターパラメーターとプロパティーセットターをどのように組み合わせるかなどの詳細は、コンストラクターを解決するロジックが期待どおりのものであることを除いて、固有のwrtプロパティーに名前を付ける必要があります。 – Stuart

4

System.UriBuilder BCLクラスはOPでPersonクラスのように見えるので、私は例として、それを使用します:

> let ub = UriBuilder("http://blog.ploeh.dk", Path = "about");;  
val ub : UriBuilder = http://blog.ploeh.dk:80/about 
関連する問題