【问题标题】:Object initialization syntax对象初始化语法
【发布时间】:2010-09-27 04:16:26
【问题描述】:

我刚开始使用 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 };

【问题讨论】:

    标签: syntax f# object-initializers


    【解决方案1】:

    你可以这样做:

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

    【讨论】:

    • 按照惯例,new 只用于一次性类。
    【解决方案2】:

    CMS 的回答绝对正确。这只是一个可能也有帮助的补充。在 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")
    

    代码要求您指定名称,但生日是一个可选参数,具有一些默认值。

    【讨论】:

    • 感谢 Tomas,但在我的情况下,Person 在另一个程序集中,我无法更改它:(
    【解决方案3】:

    您也可以省略 new 关键字并使用较少冗长的语法:

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

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

    【讨论】:

    • new-less 语法在 F# 中看起来更好
    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 2021-05-23
    • 2016-02-26
    • 2016-09-16
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多