2016-12-30 94 views
6

know that在F#如果你有一个C#类的格式:f让一个构造函数#对象初始化

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

可以初始化它像这样,这是很好的:

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

但是如何如果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; } 
} 

我们是不是被迫使用th是结构呢?

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)for详细信息,包括如何混合可选的构造函数参数和属性设置器,它们必须被唯一命名为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