Syntaxe d'initialisation d'objet

99

Je commence juste avec F # et je ne trouve pas la syntaxe pour faire l'initialisation d'objet comme en C # 3.

Ie étant donné ceci:

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

comment écrire ce qui suit en F #:

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

Réponses:

137

Vous pouvez le faire comme ceci:

let p = new Person (Name = "John", BirthDate = DateTime.Now)
CMS
la source
Par convention, new n'est utilisé qu'avec les classes jetables.
ShawnMartin
98

la réponse du CMS est tout à fait correcte. Voici juste un ajout qui peut également être utile. En F #, vous souhaitez souvent écrire le type en utilisant simplement des propriétés immuables. Lors de l'utilisation de la syntaxe "object initializer", les propriétés doivent être modifiables. Une alternative en F # est d'utiliser des arguments nommés, ce qui vous donne une syntaxe similaire, mais garde les choses immuables:

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

Maintenant, nous pouvons écrire:

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

Le code vous oblige à spécifier le nom, mais l'anniversaire est un argument facultatif avec une valeur par défaut.

Tomas Petricek
la source
Merci Tomas, mais dans mon cas Person est dans une autre assemblée et je ne peux pas la changer :(
Mauricio Scheffer