Sintaxe de inicialização de objeto

99

Estou apenas começando com F # e não consigo encontrar a sintaxe para fazer a inicialização de objetos como em C # 3.

Ou seja, dado isso:

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

como faço para escrever o seguinte em F #:

var p = new Person { Name = "John", BirthDate = DateTime.Now };
Mauricio Scheffer
fonte

Respostas:

137

Você pode fazer assim:

let p = new Person (Name = "John", BirthDate = DateTime.Now)
CMS
fonte
Por convenção, new só é usado com classes descartáveis.
ShawnMartin de
98

a resposta do CMS é definitivamente correta. Aqui está apenas um acréscimo que também pode ser útil. Em F #, você geralmente deseja escrever o tipo apenas usando propriedades imutáveis. Ao usar a sintaxe do "inicializador de objeto", as propriedades devem ser mutáveis. Uma alternativa em F # é usar argumentos nomeados, que fornecem uma sintaxe semelhante, mas mantém as coisas imutáveis:

type Person(name:string, ?birthDate) =
  member x.Name = name
  member x.BirthDate = defaultArg birthDate System.DateTime.MinValue

Agora podemos escrever:

let p1 = new Person(name="John", birthDate=DateTime.Now)
let p2 = new Person(name="John")

O código requer que você especifique o nome, mas aniversário é um argumento opcional com algum valor padrão.

Tomas Petricek
fonte
Obrigado Tomas, mas no meu caso a Pessoa está em outra assembléia e não posso alterá-la :(
Mauricio Scheffer