103 votes

Syntaxe d'initialisation des objets

Je débute avec F# et je ne trouve pas la syntaxe pour faire l'initialisation des objets comme en C# 3.

Je veux dire, étant donné ceci :

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

comment puis-je écrire ce qui suit en F# :

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

144voto

CMS Points 315406

Vous pouvez le faire comme ça :

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

2 votes

Par convention nouveau n'est utilisé qu'avec les classes jetables.

99voto

Tomas Petricek Points 118959

La réponse du CMS est définitivement correcte. Voici un ajout qui peut également être utile. En F#, vous souhaitez souvent écrire le type en utilisant simplement des propriétés immuables. En utilisant la syntaxe "object initializer", les propriétés doivent être mutables. 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 demande de spécifier le nom, mais l'anniversaire est un argument facultatif avec une valeur par défaut.

0 votes

Merci Tomas, mais dans mon cas, Person est dans un autre assemblage et je ne peux pas le changer :(

2voto

Vous pouvez également omettre le new et utiliser une syntaxe moins verbeuse :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X