Синтаксис инициализации объекта

99

Я только начинаю работать с 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 };
Маурисио Шеффер
источник

Ответы:

137

Сделать это можно так:

let p = new Person (Name = "John", BirthDate = DateTime.Now)
Кристиан К. Сальвадо
источник
По соглашению new используется только с одноразовыми классами.
ShawnMartin
98

ответ от 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")

Код требует, чтобы вы указали имя, но день рождения - это необязательный аргумент с некоторым значением по умолчанию.

Томаш Петричек
источник
Спасибо, Томас, но в моем случае Person находится в другой сборке, и я не могу его изменить :(
Маурисио Шеффер