使用构造函数进行F#对象初始化

Luk*_*ett 10 f# constructor initialization

知道在F#中如果你有一个格式的C#类:

public class Person {
    public DateTime BirthDate { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

let p = new Person (Name = "John", BirthDate = DateTime.Now)
Run Code Online (Sandbox Code Playgroud)

但是如果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; }
}
Run Code Online (Sandbox Code Playgroud)

我们是否被迫使用这种结构?

let p = new Person (123)
p.Name <- "John"
p.BirthDate <- DateTime.Now
Run Code Online (Sandbox Code Playgroud)

Stu*_*art 15

对自动属性使用等效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
Run Code Online (Sandbox Code Playgroud)

  • 是的,所以请参阅[此处](https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/members/constructors#assigning-values-to-properties-at-initialization)了解详情,包括如何混合可选的构造函数参数和属性设置器,它们必须被命名为唯一的wrt属性,而不是解析构造函数的逻辑正如您所期望的那样. (2认同)

Mar*_*ann 6

System.UriBuilderBCL类看起来像Person在OP类,所以我将用其作为一个例子:

> let ub = UriBuilder("http://blog.ploeh.dk", Path = "about");;    
val ub : UriBuilder = http://blog.ploeh.dk:80/about
Run Code Online (Sandbox Code Playgroud)